< Module exactEval:host.
< Theorem fresh_name_unique : forall Base Names FA FB, fresh_name Base Names FA -> fresh_name Base Names FB -> FA = FB. ============================ forall Base Names FA FB, fresh_name Base Names FA -> fresh_name Base Names FB -> FA = FB
< induction on 1. IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB ============================ forall Base Names FA FB, fresh_name Base Names FA @ -> fresh_name Base Names FB -> FA = FB
< intros FA FB. Variables: Base Names FA FB IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : fresh_name Base Names FA @ FB : fresh_name Base Names FB ============================ FA = FB
< FA: case FA. Subgoal 1: Variables: Names FA FB IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FB : fresh_name FA Names FB FA : not_mem FA Names ============================ FA = FB
< FB: case FB. Subgoal 1.1: Variables: Names FB IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : not_mem FB Names FB : not_mem FB Names ============================ FB = FB
< search. Subgoal 1.2: Variables: Names FA FB NewBase IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : not_mem FA Names FB : mem FA Names FB1 : FA ++ "_" = NewBase FB2 : fresh_name NewBase Names FB ============================ FA = FB
< apply not_mem to FA FB. Subgoal 2: Variables: Base Names FA FB NewBase IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FB : fresh_name Base Names FB FA : mem Base Names FA1 : Base ++ "_" = NewBase FA2 : fresh_name NewBase Names FA * ============================ FA = FB
< FB: case FB. Subgoal 2.1: Variables: Names FA FB NewBase IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : mem FB Names FA1 : FB ++ "_" = NewBase FA2 : fresh_name NewBase Names FA * FB : not_mem FB Names ============================ FA = FB
< apply not_mem to FB FA. Subgoal 2.2: Variables: Base Names FA FB NewBase NewBase1 IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : mem Base Names FA1 : Base ++ "_" = NewBase FA2 : fresh_name NewBase Names FA * FB : mem Base Names FB1 : Base ++ "_" = NewBase1 FB2 : fresh_name NewBase1 Names FB ============================ FA = FB
< apply append_unique to FA1 FB1. Subgoal 2.2: Variables: Base Names FA FB NewBase1 IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : mem Base Names FA1 : Base ++ "_" = NewBase1 FA2 : fresh_name NewBase1 Names FA * FB : mem Base Names FB1 : Base ++ "_" = NewBase1 FB2 : fresh_name NewBase1 Names FB ============================ FA = FB
< apply IH to FA2 FB2. Subgoal 2.2: Variables: Base Names FB NewBase1 IH : forall Base Names FA FB, fresh_name Base Names FA * -> fresh_name Base Names FB -> FA = FB FA : mem Base Names FA1 : Base ++ "_" = NewBase1 FA2 : fresh_name NewBase1 Names FB * FB : mem Base Names FB1 : Base ++ "_" = NewBase1 FB2 : fresh_name NewBase1 Names FB ============================ FB = FB
< search. Proof completed.
< Theorem fresh_name_unique_mems : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB. ============================ forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB
< induction on 1. IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB ============================ forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA @ -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB
< intros FA FB MAB MBA. Variables: Base NamesA NamesB FA FB IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB FA : fresh_name Base NamesA FA @ FB : fresh_name Base NamesB FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA ============================ FA = FB
< FA: case FA. Subgoal 1: Variables: NamesA NamesB FA FB IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB FB : fresh_name FA NamesB FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : not_mem FA NamesA ============================ FA = FB
< FB: case FB. Subgoal 1.1: Variables: NamesA NamesB FB IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : not_mem FB NamesA FB : not_mem FB NamesB ============================ FB = FB
< search. Subgoal 1.2: Variables: NamesA NamesB FA FB NewBase IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : not_mem FA NamesA FB : mem FA NamesB FB1 : FA ++ "_" = NewBase FB2 : fresh_name NewBase NamesB FB ============================ FA = FB
< MA: apply MBA to FB. Subgoal 1.2: Variables: NamesA NamesB FA FB NewBase IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : not_mem FA NamesA FB : mem FA NamesB FB1 : FA ++ "_" = NewBase FB2 : fresh_name NewBase NamesB FB MA : mem FA NamesA ============================ FA = FB
< apply not_mem to FA MA. Subgoal 2: Variables: Base NamesA NamesB FA FB NewBase IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB FB : fresh_name Base NamesB FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : mem Base NamesA FA1 : Base ++ "_" = NewBase FA2 : fresh_name NewBase NamesA FA * ============================ FA = FB
< FB: case FB. Subgoal 2.1: Variables: NamesA NamesB FA FB NewBase IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : mem FB NamesA FA1 : FB ++ "_" = NewBase FA2 : fresh_name NewBase NamesA FA * FB : not_mem FB NamesB ============================ FA = FB
< MB: apply MAB to FA. Subgoal 2.1: Variables: NamesA NamesB FA FB NewBase IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : mem FB NamesA FA1 : FB ++ "_" = NewBase FA2 : fresh_name NewBase NamesA FA * FB : not_mem FB NamesB MB : mem FB NamesB ============================ FA = FB
< apply not_mem to FB MB. Subgoal 2.2: Variables: Base NamesA NamesB FA FB NewBase NewBase1 IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : mem Base NamesA FA1 : Base ++ "_" = NewBase FA2 : fresh_name NewBase NamesA FA * FB : mem Base NamesB FB1 : Base ++ "_" = NewBase1 FB2 : fresh_name NewBase1 NamesB FB ============================ FA = FB
< apply append_unique to FA1 FB1. Subgoal 2.2: Variables: Base NamesA NamesB FA FB NewBase1 IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : mem Base NamesA FA1 : Base ++ "_" = NewBase1 FA2 : fresh_name NewBase1 NamesA FA * FB : mem Base NamesB FB1 : Base ++ "_" = NewBase1 FB2 : fresh_name NewBase1 NamesB FB ============================ FA = FB
< apply IH to FA2 FB2 _ _. Subgoal 2.2: Variables: Base NamesA NamesB FB NewBase1 IH : forall Base NamesA NamesB FA FB, fresh_name Base NamesA FA * -> fresh_name Base NamesB FB -> (forall X, mem X NamesA -> mem X NamesB) -> (forall X, mem X NamesB -> mem X NamesA) -> FA = FB MAB : forall X, mem X NamesA -> mem X NamesB MBA : forall X, mem X NamesB -> mem X NamesA FA : mem Base NamesA FA1 : Base ++ "_" = NewBase1 FA2 : fresh_name NewBase1 NamesA FB * FB : mem Base NamesB FB1 : Base ++ "_" = NewBase1 FB2 : fresh_name NewBase1 NamesB FB ============================ FB = FB
< search. Proof completed.
< Theorem fresh_name_is : forall Base Names F, is_string Base -> fresh_name Base Names F -> is_string F. ============================ forall Base Names F, is_string Base -> fresh_name Base Names F -> is_string F
< induction on 2. IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> is_string F ============================ forall Base Names F, is_string Base -> fresh_name Base Names F @ -> is_string F
< intros Is FN. Variables: Base Names F IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> is_string F Is : is_string Base FN : fresh_name Base Names F @ ============================ is_string F
< FN: case FN. Subgoal 1: Variables: Names F IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> is_string F Is : is_string F FN : not_mem F Names ============================ is_string F
< search. Subgoal 2: Variables: Base Names F NewBase IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> is_string F Is : is_string Base FN : mem Base Names FN1 : Base ++ "_" = NewBase FN2 : fresh_name NewBase Names F * ============================ is_string F
< apply append_string_is to _ _ FN1. Subgoal 2: Variables: Base Names F NewBase IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> is_string F Is : is_string Base FN : mem Base Names FN1 : Base ++ "_" = NewBase FN2 : fresh_name NewBase Names F * H1 : is_string NewBase ============================ is_string F
< apply IH to _ FN2. Subgoal 2: Variables: Base Names F NewBase IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> is_string F Is : is_string Base FN : mem Base Names FN1 : Base ++ "_" = NewBase FN2 : fresh_name NewBase Names F * H1 : is_string NewBase H2 : is_string F ============================ is_string F
< search. Proof completed.
< Theorem mem_string_list_or_not : forall S L, is_string S -> is_list is_string L -> mem S L \/ (mem S L -> false). ============================ forall S L, is_string S -> is_list is_string L -> mem S L \/ (mem S L -> false)
< induction on 2. IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) ============================ forall S L, is_string S -> is_list is_string L @ -> mem S L \/ (mem S L -> false)
< intros IsS IsL. Variables: S L IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_list is_string L @ ============================ mem S L \/ (mem S L -> false)
< IsL: case IsL. Subgoal 1: Variables: S IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S ============================ mem S [] \/ (mem S [] -> false)
< right. Subgoal 1: Variables: S IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S ============================ mem S [] -> false
< intros M. Subgoal 1: Variables: S IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S M : mem S [] ============================ false
< case M. Subgoal 2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * ============================ mem S (H::T) \/ (mem S (H::T) -> false)
< Or: apply is_string_eq_or_not to IsS IsL. Subgoal 2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * Or : S = H \/ (S = H -> false) ============================ mem S (H::T) \/ (mem S (H::T) -> false)
< E: case Or. Subgoal 2.1: Variables: T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string H IsL : is_string H IsL1 : is_list is_string T * ============================ mem H (H::T) \/ (mem H (H::T) -> false)
< search. Subgoal 2.2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false ============================ mem S (H::T) \/ (mem S (H::T) -> false)
< Or: apply IH to IsS IsL1. Subgoal 2.2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false Or : mem S T \/ (mem S T -> false) ============================ mem S (H::T) \/ (mem S (H::T) -> false)
< M: case Or. Subgoal 2.2.1: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false M : mem S T ============================ mem S (H::T) \/ (mem S (H::T) -> false)
< search. Subgoal 2.2.2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false M : mem S T -> false ============================ mem S (H::T) \/ (mem S (H::T) -> false)
< right. Subgoal 2.2.2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false M : mem S T -> false ============================ mem S (H::T) -> false
< intros X. Subgoal 2.2.2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false M : mem S T -> false X : mem S (H::T) ============================ false
< case X. Subgoal 2.2.2.1: Variables: T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string H IsL : is_string H IsL1 : is_list is_string T * E : H = H -> false M : mem H T -> false ============================ false
< backchain E. Subgoal 2.2.2.2: Variables: S T H IH : forall S L, is_string S -> is_list is_string L * -> mem S L \/ (mem S L -> false) IsS : is_string S IsL : is_string H IsL1 : is_list is_string T * E : S = H -> false M : mem S T -> false H1 : mem S T ============================ false
< backchain M. Proof completed.
< Theorem mem_is_string : forall L X, is_list is_string L -> mem X L -> is_string X. ============================ forall L X, is_list is_string L -> mem X L -> is_string X
< induction on 2. IH : forall L X, is_list is_string L -> mem X L * -> is_string X ============================ forall L X, is_list is_string L -> mem X L @ -> is_string X
< intros Is M. Variables: L X IH : forall L X, is_list is_string L -> mem X L * -> is_string X Is : is_list is_string L M : mem X L @ ============================ is_string X
< M: case M. Subgoal 1: Variables: X Rest IH : forall L X, is_list is_string L -> mem X L * -> is_string X Is : is_list is_string (X::Rest) ============================ is_string X
< case Is. Subgoal 1: Variables: X Rest IH : forall L X, is_list is_string L -> mem X L * -> is_string X H1 : is_string X H2 : is_list is_string Rest ============================ is_string X
< search. Subgoal 2: Variables: X Rest I IH : forall L X, is_list is_string L -> mem X L * -> is_string X Is : is_list is_string (I::Rest) M : mem X Rest * ============================ is_string X
< case Is. Subgoal 2: Variables: X Rest I IH : forall L X, is_list is_string L -> mem X L * -> is_string X M : mem X Rest * H1 : is_string I H2 : is_list is_string Rest ============================ is_string X
< apply IH to _ M. Subgoal 2: Variables: X Rest I IH : forall L X, is_list is_string L -> mem X L * -> is_string X M : mem X Rest * H1 : is_string I H2 : is_list is_string Rest H3 : is_string X ============================ is_string X
< search. Proof completed.
< Theorem select_string_list_is : forall S L L', is_list is_string L -> select S L' L -> is_list is_string L'. ============================ forall S L L', is_list is_string L -> select S L' L -> is_list is_string L'
< induction on 2. IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' ============================ forall S L L', is_list is_string L -> select S L' L @ -> is_list is_string L'
< intros Is S. Variables: S L L' IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' Is : is_list is_string L S : select S L' L @ ============================ is_list is_string L'
< S: case S. Subgoal 1: Variables: S L' IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' Is : is_list is_string (S::L') ============================ is_list is_string L'
< case Is. Subgoal 1: Variables: S L' IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' H1 : is_string S H2 : is_list is_string L' ============================ is_list is_string L'
< search. Subgoal 2: Variables: S L2 I L1 IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' Is : is_list is_string (I::L2) S : select S L1 L2 * ============================ is_list is_string (I::L1)
< case Is. Subgoal 2: Variables: S L2 I L1 IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' S : select S L1 L2 * H1 : is_string I H2 : is_list is_string L2 ============================ is_list is_string (I::L1)
< apply IH to _ S. Subgoal 2: Variables: S L2 I L1 IH : forall S L L', is_list is_string L -> select S L' L * -> is_list is_string L' S : select S L1 L2 * H1 : is_string I H2 : is_list is_string L2 H3 : is_list is_string L1 ============================ is_list is_string (I::L1)
< search. Proof completed.
< Theorem select_length [A] : forall (X : A) L L' N N', select X L' L -> length L N -> 1 + N' = N -> length L' N'. ============================ forall X L L' N N', select X L' L -> length L N -> 1 + N' = N -> length L' N'
< induction on 1. IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' ============================ forall X L L' N N', select X L' L @ -> length L N -> 1 + N' = N -> length L' N'
< intros S L P. Variables: X L L' N N' IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' S : select X L' L @ L : length L N P : 1 + N' = N ============================ length L' N'
< S: case S. Subgoal 1: Variables: X L' N N' IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N ============================ length L' N'
< L: case L (keep). Subgoal 1: Variables: X L' N N' N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N L1 : length L' N'1 L2 : 1 + N'1 = N ============================ length L' N'
< IsN: apply length_is to L. Subgoal 1: Variables: X L' N N' N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N L1 : length L' N'1 L2 : 1 + N'1 = N IsN : is_integer N ============================ length L' N'
< Is: apply plus_integer_is_integer_result to IsN P. Subgoal 1: Variables: X L' N N' N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N L1 : length L' N'1 L2 : 1 + N'1 = N IsN : is_integer N Is : is_integer 1 Is1 : is_integer N' ============================ length L' N'
< clear Is. Subgoal 1: Variables: X L' N N' N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N L1 : length L' N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N' ============================ length L' N'
< Is: apply plus_integer_is_integer_result to IsN L2. Subgoal 1: Variables: X L' N N' N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N L1 : length L' N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N' Is : is_integer 1 Is2 : is_integer N'1 ============================ length L' N'
< clear Is. Subgoal 1: Variables: X L' N N' N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N' = N L1 : length L' N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N' Is2 : is_integer N'1 ============================ length L' N'
< apply plus_integer_unique_addend to _ _ _ P L2. Subgoal 1: Variables: X L' N N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (X::L') N P : 1 + N'1 = N L1 : length L' N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 Is2 : is_integer N'1 ============================ length L' N'1
< search. Subgoal 2: Variables: X N N' L2 I L1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * ============================ length (I::L1) N'
< L: case L (keep). Subgoal 2: Variables: X N N' L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N ============================ length (I::L1) N'
< IsN: apply length_is to L. Subgoal 2: Variables: X N N' L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N ============================ length (I::L1) N'
< Is: apply plus_integer_is_integer_result to IsN P. Subgoal 2: Variables: X N N' L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is : is_integer 1 Is1 : is_integer N' ============================ length (I::L1) N'
< clear Is. Subgoal 2: Variables: X N N' L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N' ============================ length (I::L1) N'
< Is: apply plus_integer_is_integer_result to IsN L2. Subgoal 2: Variables: X N N' L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N' Is : is_integer 1 Is2 : is_integer N'1 ============================ length (I::L1) N'
< clear Is. Subgoal 2: Variables: X N N' L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N' = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N' Is2 : is_integer N'1 ============================ length (I::L1) N'
< apply plus_integer_unique_addend to _ _ _ P L2. Subgoal 2: Variables: X N L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 Is2 : is_integer N'1 ============================ length (I::L1) N'1
< clear Is2. Subgoal 2: Variables: X N L2 I L1 N'1 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 ============================ length (I::L1) N'1
< M: apply minus_integer_total to Is1 _ with N2 = 1. Subgoal 2: Variables: X N L2 I L1 N'1 N3 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 M : N'1 - 1 = N3 ============================ length (I::L1) N'1
< P': apply minus_plus_same_integer to _ _ M. Subgoal 2: Variables: X N L2 I L1 N'1 N3 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 M : N'1 - 1 = N3 P' : N3 + 1 = N'1 ============================ length (I::L1) N'1
< apply minus_integer_is_integer to _ _ M. Subgoal 2: Variables: X N L2 I L1 N'1 N3 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 M : N'1 - 1 = N3 P' : N3 + 1 = N'1 H1 : is_integer N3 ============================ length (I::L1) N'1
< P'': apply plus_integer_comm to _ _ P'. Subgoal 2: Variables: X N L2 I L1 N'1 N3 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 M : N'1 - 1 = N3 P' : N3 + 1 = N'1 H1 : is_integer N3 P'' : 1 + N3 = N'1 ============================ length (I::L1) N'1
< apply IH to S L1 P''. Subgoal 2: Variables: X N L2 I L1 N'1 N3 IH : forall X L L' N N', select X L' L * -> length L N -> 1 + N' = N -> length L' N' L : length (I::L2) N P : 1 + N'1 = N S : select X L1 L2 * L1 : length L2 N'1 L2 : 1 + N'1 = N IsN : is_integer N Is1 : is_integer N'1 M : N'1 - 1 = N3 P' : N3 + 1 = N'1 H1 : is_integer N3 P'' : 1 + N3 = N'1 H2 : length L1 N3 ============================ length (I::L1) N'1
< search. Proof completed.
< Theorem length_exists_string : forall L, is_list is_string L -> exists N, length L N. ============================ forall L, is_list is_string L -> exists N, length L N
< induction on 1. IH : forall L, is_list is_string L * -> exists N, length L N ============================ forall L, is_list is_string L @ -> exists N, length L N
< intros Is. Variables: L IH : forall L, is_list is_string L * -> exists N, length L N Is : is_list is_string L @ ============================ exists N, length L N
< Is: case Is. Subgoal 1: IH : forall L, is_list is_string L * -> exists N, length L N ============================ exists N, length [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_string L * -> exists N, length L N Is : is_string H Is1 : is_list is_string T * ============================ exists N, length (H::T) N
< Len: apply IH to Is1. Subgoal 2: Variables: T H N IH : forall L, is_list is_string L * -> exists N, length L N Is : is_string H Is1 : is_list is_string T * Len : length T N ============================ exists N, length (H::T) N
< IsN: apply length_is to Len. Subgoal 2: Variables: T H N IH : forall L, is_list is_string L * -> exists N, length L N Is : is_string H Is1 : is_list is_string T * Len : length T N IsN : is_integer N ============================ exists N, length (H::T) N
< apply plus_integer_total to _ IsN with N1 = 1. Subgoal 2: Variables: T H N N3 IH : forall L, is_list is_string L * -> exists N, length L N Is : is_string H Is1 : is_list is_string T * Len : length T N IsN : is_integer N H1 : 1 + N = N3 ============================ exists N, length (H::T) N
< search. Proof completed.
< Theorem not_mem_not_mem : forall X L, is_list is_string L -> (mem X L -> false) -> not_mem X L. ============================ forall X L, is_list is_string L -> (mem X L -> false) -> not_mem X L
< induction on 1. IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L ============================ forall X L, is_list is_string L @ -> (mem X L -> false) -> not_mem X L
< intros IsL NM. Variables: X L IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L IsL : is_list is_string L @ NM : mem X L -> false ============================ not_mem X L
< Is: case IsL. Subgoal 1: Variables: X IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X [] -> false ============================ not_mem X []
< search. Subgoal 2: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * ============================ not_mem X (H::T)
< unfold . Subgoal 2.1: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * ============================ H = X -> false
< intros E. Subgoal 2.1: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * E : H = X ============================ false
< case E. Subgoal 2.1: Variables: X T IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (X::T) -> false Is : is_string X Is1 : is_list is_string T * ============================ false
< backchain NM. Subgoal 2.2: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * ============================ not_mem X T
< apply IH to Is1 _ with X = X. Subgoal 2.2.1: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * ============================ mem X T -> false
< intros M. Subgoal 2.2.1: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * M : mem X T ============================ false
< backchain NM. Subgoal 2.2: Variables: X T H IH : forall X L, is_list is_string L * -> (mem X L -> false) -> not_mem X L NM : mem X (H::T) -> false Is : is_string H Is1 : is_list is_string T * H1 : not_mem X T ============================ not_mem X T
< search. Proof completed.
< Define adds_ : (string) -> (string) -> prop by adds_ S S; adds_ S U := exists S', S ++ "_" = S' /\ adds_ S' U.
< Theorem fresh_name_remove : forall Base Names F S Names', fresh_name Base Names F -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F. ============================ forall Base Names F S Names', fresh_name Base Names F -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F
< induction on 1. IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F ============================ forall Base Names F S Names', fresh_name Base Names F @ -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F
< intros F NA S. Variables: Base Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F F : fresh_name Base Names F @ NA : adds_ Base S -> false S : select S Names' Names ============================ fresh_name Base Names' F
< F: case F. Subgoal 1: Variables: Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ F S -> false S : select S Names' Names F : not_mem F Names ============================ fresh_name F Names' F
< apply not_mem_before_select_after to S F. Subgoal 1: Variables: Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ F S -> false S : select S Names' Names F : not_mem F Names H1 : not_mem F Names' ============================ fresh_name F Names' F
< search. Subgoal 2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * ============================ fresh_name Base Names' F
< apply IH to F2 _ S. Subgoal 2.1: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * ============================ adds_ NewBase S -> false
< intros A. Subgoal 2.1: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * A : adds_ NewBase S ============================ false
< backchain NA. Subgoal 2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F ============================ fresh_name Base Names' F
< apply mem_before_select_after to S F _. Subgoal 2.2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F ============================ S = Base -> false
< intros E. Subgoal 2.2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F E : S = Base ============================ false
< case E. Subgoal 2.2: Variables: Base Names F Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base Base -> false S : select Base Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F ============================ false
< backchain NA. Subgoal 2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names' Names -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names' Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F H2 : mem Base Names' ============================ fresh_name Base Names' F
< search. Proof completed.
< Theorem fresh_name_add : forall Base Names F S Names', fresh_name Base Names F -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F. ============================ forall Base Names F S Names', fresh_name Base Names F -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F
< induction on 1. IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F ============================ forall Base Names F S Names', fresh_name Base Names F @ -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F
< intros F NA S. Variables: Base Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F F : fresh_name Base Names F @ NA : adds_ Base S -> false S : select S Names Names' ============================ fresh_name Base Names' F
< F: case F. Subgoal 1: Variables: Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ F S -> false S : select S Names Names' F : not_mem F Names ============================ fresh_name F Names' F
< apply not_mem_after_select_before to S F _. Subgoal 1.1: Variables: Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ F S -> false S : select S Names Names' F : not_mem F Names ============================ S = F -> false
< intros E. Subgoal 1.1: Variables: Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ F S -> false S : select S Names Names' F : not_mem F Names E : S = F ============================ false
< case E. Subgoal 1.1: Variables: Names F Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ F F -> false S : select F Names Names' F : not_mem F Names ============================ false
< backchain NA. Subgoal 1: Variables: Names F S Names' IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ F S -> false S : select S Names Names' F : not_mem F Names H1 : not_mem F Names' ============================ fresh_name F Names' F
< search. Subgoal 2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names Names' F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * ============================ fresh_name Base Names' F
< apply IH to F2 _ S. Subgoal 2.1: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names Names' F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * ============================ adds_ NewBase S -> false
< intros A. Subgoal 2.1: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names Names' F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * A : adds_ NewBase S ============================ false
< backchain NA. Subgoal 2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names Names' F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F ============================ fresh_name Base Names' F
< apply mem_after_select_before to S F. Subgoal 2: Variables: Base Names F S Names' NewBase IH : forall Base Names F S Names', fresh_name Base Names F * -> (adds_ Base S -> false) -> select S Names Names' -> fresh_name Base Names' F NA : adds_ Base S -> false S : select S Names Names' F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : fresh_name NewBase Names' F H2 : mem Base Names' ============================ fresh_name Base Names' F
< search. Proof completed.
< Theorem length_adds_ : forall A B NA NB, adds_ A B -> length A NA -> length B NB -> NA <= NB. ============================ forall A B NA NB, adds_ A B -> length A NA -> length B NB -> NA <= NB
< induction on 1. IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB ============================ forall A B NA NB, adds_ A B @ -> length A NA -> length B NB -> NA <= NB
< intros Add LA LB. Variables: A B NA NB IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB Add : adds_ A B @ LA : length A NA LB : length B NB ============================ NA <= NB
< Add: case Add. Subgoal 1: Variables: B NA NB IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length B NA LB : length B NB ============================ NA <= NB
< apply length_unique to LA LB. Subgoal 1: Variables: B NB IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length B NB LB : length B NB ============================ NB <= NB
< IsN: apply length_is to LA. Subgoal 1: Variables: B NB IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length B NB LB : length B NB IsN : is_integer NB ============================ NB <= NB
< apply is_integer_lesseq to IsN. Subgoal 1: Variables: B NB IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length B NB LB : length B NB IsN : is_integer NB H1 : NB <= NB ============================ NB <= NB
< search. Subgoal 2: Variables: A B NA NB S' IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * ============================ NA <= NB
< IsNA: apply length_is to LA. Subgoal 2: Variables: A B NA NB S' IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA ============================ NA <= NB
< P: apply plus_integer_total to IsNA _ with N2 = 1. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 ============================ NA <= NB
< LenS': apply append_length to Add LA _ P. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 LenS' : length S' N3 ============================ NA <= NB
< LEq: apply IH to Add1 LenS' LB. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 LenS' : length S' N3 LEq : N3 <= NB ============================ NA <= NB
< P': apply plus_integer_comm to _ _ P. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 LenS' : length S' N3 LEq : N3 <= NB P' : 1 + NA = N3 ============================ NA <= NB
< L: apply lt_plus_one to P' _. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 LenS' : length S' N3 LEq : N3 <= NB P' : 1 + NA = N3 L : NA < N3 ============================ NA <= NB
< LEq': apply less_integer_lesseq to L. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 LenS' : length S' N3 LEq : N3 <= NB P' : 1 + NA = N3 L : NA < N3 LEq' : NA <= N3 ============================ NA <= NB
< apply lesseq_integer_transitive to LEq' LEq. Subgoal 2: Variables: A B NA NB S' N3 IH : forall A B NA NB, adds_ A B * -> length A NA -> length B NB -> NA <= NB LA : length A NA LB : length B NB Add : A ++ "_" = S' Add1 : adds_ S' B * IsNA : is_integer NA P : NA + 1 = N3 LenS' : length S' N3 LEq : N3 <= NB P' : 1 + NA = N3 L : NA < N3 LEq' : NA <= N3 H1 : NA <= NB ============================ NA <= NB
< search. Proof completed.
< Theorem not_adds_ : forall Base S, is_string Base -> adds_ S Base -> Base ++ "_" = S -> false. ============================ forall Base S, is_string Base -> adds_ S Base -> Base ++ "_" = S -> false
< intros IsBase Add App. Variables: Base S IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S ============================ false
< LenBase: apply string_length_total to IsBase. Variables: Base S N IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N ============================ false
< IsN: apply length_is to LenBase. Variables: Base S N IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N IsN : is_integer N ============================ false
< P: apply plus_integer_total to IsN _ with N2 = 1. Variables: Base S N N3 IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N IsN : is_integer N P : N + 1 = N3 ============================ false
< LenS: apply append_length to App LenBase _ P. Variables: Base S N N3 IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N IsN : is_integer N P : N + 1 = N3 LenS : length S N3 ============================ false
< P': apply plus_integer_comm to _ _ P. Variables: Base S N N3 IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N IsN : is_integer N P : N + 1 = N3 LenS : length S N3 P' : 1 + N = N3 ============================ false
< L: apply lt_plus_one to P' _. Variables: Base S N N3 IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N IsN : is_integer N P : N + 1 = N3 LenS : length S N3 P' : 1 + N = N3 L : N < N3 ============================ false
< LEq: apply length_adds_ to Add LenS LenBase. Variables: Base S N N3 IsBase : is_string Base Add : adds_ S Base App : Base ++ "_" = S LenBase : length Base N IsN : is_integer N P : N + 1 = N3 LenS : length S N3 P' : 1 + N = N3 L : N < N3 LEq : N3 <= N ============================ false
< apply less_lesseq_flip_false to L LEq. Proof completed.
< Theorem fresh_name_exists_acc : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len -> exists F, fresh_name Base Names F. ============================ forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len -> exists F, fresh_name Base Names F
< induction on 4. IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F ============================ forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len @ -> exists F, fresh_name Base Names F
< intros IsBase IsNames Len Acc. Variables: Base Names Len IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ ============================ exists F, fresh_name Base Names F
< Or: apply mem_string_list_or_not to IsBase IsNames. Variables: Base Names Len IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ Or : mem Base Names \/ (mem Base Names -> false) ============================ exists F, fresh_name Base Names F
< M: case Or. Subgoal 1: Variables: Base Names Len IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names ============================ exists F, fresh_name Base Names F
< S: apply mem_select to M. Subgoal 1: Variables: Base Names Len L' IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names ============================ exists F, fresh_name Base Names F
< IsLen: apply length_is to Len. Subgoal 1: Variables: Base Names Len L' IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len ============================ exists F, fresh_name Base Names F
< Minus: apply minus_integer_total to IsLen _ with N2 = 1. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 ============================ exists F, fresh_name Base Names F
< P: apply minus_plus_same_integer to _ _ Minus. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len ============================ exists F, fresh_name Base Names F
< IsN3: apply minus_integer_is_integer to _ _ Minus. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 ============================ exists F, fresh_name Base Names F
< P': apply plus_integer_comm to _ _ P. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len ============================ exists F, fresh_name Base Names F
< Len': apply select_length to S Len P'. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 ============================ exists F, fresh_name Base Names F
< L: apply lt_plus_one to P' _. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len ============================ exists F, fresh_name Base Names F
< Acc: case Acc. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * ============================ exists F, fresh_name Base Names F
< G: apply length_geq_0 to Len'. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * G : N3 >= 0 ============================ exists F, fresh_name Base Names F
< Pos: case G. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 ============================ exists F, fresh_name Base Names F
< A: apply Acc to _ L. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * ============================ exists F, fresh_name Base Names F
< IsL': apply select_string_list_is to _ S. Subgoal 1: Variables: Base Names Len L' N3 IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' ============================ exists F, fresh_name Base Names F
< App: apply append_string_total to IsBase _ with S2 = "_". Subgoal 1: Variables: Base Names Len L' N3 S IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S ============================ exists F, fresh_name Base Names F
< IsS: apply append_string_is to _ _ App. Subgoal 1: Variables: Base Names Len L' N3 S IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S IsS : is_string S ============================ exists F, fresh_name Base Names F
< F: apply IH to IsS IsL' Len' A. Subgoal 1: Variables: Base Names Len L' N3 S F IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S IsS : is_string S F : fresh_name S L' F ============================ exists F, fresh_name Base Names F
< exists F. Subgoal 1: Variables: Base Names Len L' N3 S F IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S IsS : is_string S F : fresh_name S L' F ============================ fresh_name Base Names F
< apply fresh_name_add to F _ S. Subgoal 1.1: Variables: Base Names Len L' N3 S F IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S IsS : is_string S F : fresh_name S L' F ============================ adds_ S Base -> false
< intros Add. Subgoal 1.1: Variables: Base Names Len L' N3 S F IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S IsS : is_string S F : fresh_name S L' F Add : adds_ S Base ============================ false
< apply not_adds_ to _ Add App. Subgoal 1: Variables: Base Names Len L' N3 S F IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len M : mem Base Names S : select Base L' Names IsLen : is_integer Len Minus : Len - 1 = N3 P : N3 + 1 = Len IsN3 : is_integer N3 P' : 1 + N3 = Len Len' : length L' N3 L : N3 < Len Acc : forall M, 0 <= M -> M < Len -> acc M * Pos : 0 <= N3 A : acc N3 * IsL' : is_list is_string L' App : Base ++ "_" = S IsS : is_string S F : fresh_name S L' F H1 : fresh_name S Names F ============================ fresh_name Base Names F
< search. Subgoal 2: Variables: Base Names Len IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names -> false ============================ exists F, fresh_name Base Names F
< apply not_mem_not_mem to _ M. Subgoal 2: Variables: Base Names Len IH : forall Base Names Len, is_string Base -> is_list is_string Names -> length Names Len -> acc Len * -> exists F, fresh_name Base Names F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names Len Acc : acc Len @ M : mem Base Names -> false H1 : not_mem Base Names ============================ exists F, fresh_name Base Names F
< search. Proof completed.
< Theorem fresh_name_exists : forall Base Names, is_string Base -> is_list is_string Names -> exists F, fresh_name Base Names F. ============================ forall Base Names, is_string Base -> is_list is_string Names -> exists F, fresh_name Base Names F
< intros IsBase IsNames. Variables: Base Names IsBase : is_string Base IsNames : is_list is_string Names ============================ exists F, fresh_name Base Names F
< Len: apply length_exists_string to IsNames. Variables: Base Names N IsBase : is_string Base IsNames : is_list is_string Names Len : length Names N ============================ exists F, fresh_name Base Names F
< IsN: apply length_is to Len. Variables: Base Names N IsBase : is_string Base IsNames : is_list is_string Names Len : length Names N IsN : is_integer N ============================ exists F, fresh_name Base Names F
< Pos: apply length_geq_0 to Len. Variables: Base Names N IsBase : is_string Base IsNames : is_list is_string Names Len : length Names N IsN : is_integer N Pos : N >= 0 ============================ exists F, fresh_name Base Names F
< L: case Pos. Variables: Base Names N IsBase : is_string Base IsNames : is_list is_string Names Len : length Names N IsN : is_integer N L : 0 <= N ============================ exists F, fresh_name Base Names F
< Acc: apply all_acc to IsN L. Variables: Base Names N IsBase : is_string Base IsNames : is_list is_string Names Len : length Names N IsN : is_integer N L : 0 <= N Acc : acc N ============================ exists F, fresh_name Base Names F
< apply fresh_name_exists_acc to IsBase IsNames Len Acc. Variables: Base Names N F IsBase : is_string Base IsNames : is_list is_string Names Len : length Names N IsN : is_integer N L : 0 <= N Acc : acc N H1 : fresh_name Base Names F ============================ exists F, fresh_name Base Names F
< search. Proof completed.
< Theorem fresh_name_not_mem : forall Base Names F, fresh_name Base Names F -> mem F Names -> false. ============================ forall Base Names F, fresh_name Base Names F -> mem F Names -> false
< induction on 1. IH : forall Base Names F, fresh_name Base Names F * -> mem F Names -> false ============================ forall Base Names F, fresh_name Base Names F @ -> mem F Names -> false
< intros F M. Variables: Base Names F IH : forall Base Names F, fresh_name Base Names F * -> mem F Names -> false F : fresh_name Base Names F @ M : mem F Names ============================ false
< F: case F. Subgoal 1: Variables: Names F IH : forall Base Names F, fresh_name Base Names F * -> mem F Names -> false M : mem F Names F : not_mem F Names ============================ false
< apply not_mem to F M. Subgoal 2: Variables: Base Names F NewBase IH : forall Base Names F, fresh_name Base Names F * -> mem F Names -> false M : mem F Names F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * ============================ false
< apply IH to F2 M. Proof completed.
< Theorem fresh_name_start : forall Base Names F, is_string Base -> fresh_name Base Names F -> exists S, Base ++ S = F. ============================ forall Base Names F, is_string Base -> fresh_name Base Names F -> exists S, Base ++ S = F
< induction on 2. IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F ============================ forall Base Names F, is_string Base -> fresh_name Base Names F @ -> exists S, Base ++ S = F
< intros IsBase F. Variables: Base Names F IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string Base F : fresh_name Base Names F @ ============================ exists S, Base ++ S = F
< F: case F. Subgoal 1: Variables: Names F IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string F F : not_mem F Names ============================ exists S, F ++ S = F
< exists "". Subgoal 1: Variables: Names F IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string F F : not_mem F Names ============================ F ++ [] = F
< A: apply append_string_total to IsBase _ with S2 = "". Subgoal 1: Variables: Names F S IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string F F : not_mem F Names A : F ++ [] = S ============================ F ++ [] = F
< apply append_nil_right to A. Subgoal 1: Variables: Names S IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string S F : not_mem S Names A : S ++ [] = S ============================ S ++ [] = S
< search. Subgoal 2: Variables: Base Names F NewBase IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string Base F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * ============================ exists S, Base ++ S = F
< apply append_string_is to _ _ F1. Subgoal 2: Variables: Base Names F NewBase IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string Base F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : is_string NewBase ============================ exists S, Base ++ S = F
< A: apply IH to _ F2. Subgoal 2: Variables: Base Names F NewBase S IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string Base F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : is_string NewBase A : NewBase ++ S = F ============================ exists S, Base ++ S = F
< apply append_associative to F1 A. Subgoal 2: Variables: Base Names F NewBase S L23 IH : forall Base Names F, is_string Base -> fresh_name Base Names F * -> exists S, Base ++ S = F IsBase : is_string Base F : mem Base Names F1 : Base ++ "_" = NewBase F2 : fresh_name NewBase Names F * H1 : is_string NewBase A : NewBase ++ S = F H2 : "_" ++ S = L23 H3 : Base ++ L23 = F ============================ exists S, Base ++ S = F
< search. Proof completed.
< Projection_Constraint proj_expr_unique : forall L1 L2 E E1 E2, PrA : L1 |{expr}- E ~~> E1 -> PrB : L2 |{expr}- E ~~> E2 -> IsE : is_expr E -> IsL1 : is_list is_string L1 -> IsL2 : is_list is_string L2 -> Rel12 : (forall X, mem X L1 -> mem X L2) -> Rel21 : (forall X, mem X L2 -> mem X L1) -> E1 = E2. Proof completed.
< Projection_Constraint proj_expr_is : forall L E E', Pr : L |{expr}- E ~~> E' -> IsE : is_expr E -> IsL : is_list is_string L -> is_expr E'. Proof completed.
< Projection_Constraint proj_expr_other : forall L E E' L', Pr : L |{expr}- E ~~> E' -> IsE : is_expr E -> IsL : is_list is_string L -> IsL' : is_list is_string L' -> exists E'', L' |{expr}- E ~~> E''. Proof completed.
< Projection_Constraint proj_stmt_unique : forall L1 L2 S S1 S2, PrA : L1 |{stmt}- S ~~> S1 -> PrB : L2 |{stmt}- S ~~> S2 -> IsS : is_stmt S -> IsL1 : is_list is_string L1 -> IsL2 : is_list is_string L2 -> Rel12 : (forall X, mem X L1 -> mem X L2) -> Rel21 : (forall X, mem X L2 -> mem X L1) -> S1 = S2. Proof completed.
< Projection_Constraint proj_stmt_is : forall L S S', Pr : L |{stmt}- S ~~> S' -> IsS : is_stmt S -> IsL : is_list is_string L -> is_stmt S'. Proof completed.
< Projection_Constraint proj_stmt_other : forall L S S' L', Pr : L |{stmt}- S ~~> S' -> IsS : is_stmt S -> IsL : is_list is_string L -> IsL' : is_list is_string L' -> exists S'', L' |{stmt}- S ~~> S''. Proof completed.
< Projection_Constraint proj_fun_unique : forall F F1 F2, PrA : |{fun}- F ~~> F1 -> PrB : |{fun}- F ~~> F2 -> IsF : is_fun F -> F1 = F2. Proof completed.
< Projection_Constraint proj_fun_is : forall F F', Pr : |{fun}- F ~~> F' -> IsF : is_fun F -> is_fun F'. Proof completed.
< Projection_Constraint proj_param_unique : forall P P1 P2, PrA : |{param}- P ~~> P1 -> PrB : |{param}- P ~~> P2 -> IsP : is_param P -> P1 = P2. Proof completed.
< Projection_Constraint proj_param_is : forall P P', Pr : |{param}- P ~~> P' -> IsP : is_param P -> is_param P'. Proof completed.
< Projection_Constraint proj_program_unique : forall P P1 P2, PrA : |{program}- P ~~> P1 -> PrB : |{program}- P ~~> P2 -> IsP : is_program P -> P1 = P2. Proof completed.
< Projection_Constraint proj_program_is : forall P P', Pr : |{program}- P ~~> P' -> IsP : is_program P -> is_program P'. Proof completed.
< Projection_Constraint proj_typ_unique : forall T T1 T2, PrA : |{typ}- T ~~> T1 -> PrB : |{typ}- T ~~> T2 -> IsT : is_typ T -> T1 = T2. Proof completed.
< Projection_Constraint proj_typ_is : forall T T', Pr : |{typ}- T ~~> T' -> IsT : is_typ T -> is_typ T'. Proof completed.
< Theorem is_list_is_string_eq_or_not : forall L1 L2, is_list is_string L1 -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false). ============================ forall L1 L2, is_list is_string L1 -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false)
< induction on 1. IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) ============================ forall L1 L2, is_list is_string L1 @ -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false)
< intros IsLA IsLB. Variables: L1 L2 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_list is_string L1 @ IsLB : is_list is_string L2 ============================ L1 = L2 \/ (L1 = L2 -> false)
< IsLA: case IsLA. Subgoal 1: Variables: L2 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLB : is_list is_string L2 ============================ [] = L2 \/ ([] = L2 -> false)
< case IsLB. Subgoal 1.1: IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) ============================ [] = [] \/ ([] = [] -> false)
< search. Subgoal 1.2: Variables: T H IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) H1 : is_string H H2 : is_list is_string T ============================ [] = H::T \/ ([] = H::T -> false)
< search. Subgoal 2: Variables: L2 T H IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLB : is_list is_string L2 IsLA : is_string H IsLA1 : is_list is_string T * ============================ H::T = L2 \/ (H::T = L2 -> false)
< IsLB: case IsLB. Subgoal 2.1: Variables: T H IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * ============================ H::T = [] \/ (H::T = [] -> false)
< search. Subgoal 2.2: Variables: T H T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 ============================ H::T = H1::T1 \/ (H::T = H1::T1 -> false)
< Or1: apply is_string_eq_or_not to IsLA IsLB. Subgoal 2.2: Variables: T H T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or1 : H = H1 \/ (H = H1 -> false) ============================ H::T = H1::T1 \/ (H::T = H1::T1 -> false)
< Or2: apply IH to IsLA1 IsLB1. Subgoal 2.2: Variables: T H T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or1 : H = H1 \/ (H = H1 -> false) Or2 : T = T1 \/ (T = T1 -> false) ============================ H::T = H1::T1 \/ (H::T = H1::T1 -> false)
< N: case Or1. Subgoal 2.2.1: Variables: T T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or2 : T = T1 \/ (T = T1 -> false) ============================ H1::T = H1::T1 \/ (H1::T = H1::T1 -> false)
< N: case Or2. Subgoal 2.2.1.1: Variables: T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T1 * IsLB : is_string H1 IsLB1 : is_list is_string T1 ============================ H1::T1 = H1::T1 \/ (H1::T1 = H1::T1 -> false)
< search. Subgoal 2.2.1.2: Variables: T T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 N : T = T1 -> false ============================ H1::T = H1::T1 \/ (H1::T = H1::T1 -> false)
< right. Subgoal 2.2.1.2: Variables: T T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 N : T = T1 -> false ============================ H1::T = H1::T1 -> false
< intros E. Subgoal 2.2.1.2: Variables: T T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 N : T = T1 -> false E : H1::T = H1::T1 ============================ false
< case E. Subgoal 2.2.1.2: Variables: T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T1 * IsLB : is_string H1 IsLB1 : is_list is_string T1 N : T1 = T1 -> false ============================ false
< backchain N. Subgoal 2.2.2: Variables: T H T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or2 : T = T1 \/ (T = T1 -> false) N : H = H1 -> false ============================ H::T = H1::T1 \/ (H::T = H1::T1 -> false)
< right. Subgoal 2.2.2: Variables: T H T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or2 : T = T1 \/ (T = T1 -> false) N : H = H1 -> false ============================ H::T = H1::T1 -> false
< intros E. Subgoal 2.2.2: Variables: T H T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H IsLA1 : is_list is_string T * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or2 : T = T1 \/ (T = T1 -> false) N : H = H1 -> false E : H::T = H1::T1 ============================ false
< case E. Subgoal 2.2.2: Variables: T1 H1 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> L1 = L2 \/ (L1 = L2 -> false) IsLA : is_string H1 IsLA1 : is_list is_string T1 * IsLB : is_string H1 IsLB1 : is_list is_string T1 Or2 : T1 = T1 \/ (T1 = T1 -> false) N : H1 = H1 -> false ============================ false
< backchain N. Proof completed.
< Proj_Rel is_expr E, is_args A, is_recFieldExprs RF, is_stmt S. Proof completed.
< Ext_Ind forall E, is_expr E; forall A, is_args A; forall RF, is_recFieldExprs RF; forall S, is_stmt S. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Subgoal 1.1: Variables: I IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (num I) @ R1 : is_integer I ============================ <is_expr {P}> (num I)
< search. Subgoal 1.2: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (plus Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (plus Expr1 Expr)
< apply IH to R1. Subgoal 1.2: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (plus Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (plus Expr1 Expr)
< apply IH to R2. Subgoal 1.2: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (plus Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (plus Expr1 Expr)
< search. Subgoal 1.3: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (minus Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (minus Expr1 Expr)
< apply IH to R1. Subgoal 1.3: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (minus Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (minus Expr1 Expr)
< apply IH to R2. Subgoal 1.3: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (minus Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (minus Expr1 Expr)
< search. Subgoal 1.4: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (mult Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (mult Expr1 Expr)
< apply IH to R1. Subgoal 1.4: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (mult Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (mult Expr1 Expr)
< apply IH to R2. Subgoal 1.4: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (mult Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (mult Expr1 Expr)
< search. Subgoal 1.5: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (div Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (div Expr1 Expr)
< apply IH to R1. Subgoal 1.5: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (div Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (div Expr1 Expr)
< apply IH to R2. Subgoal 1.5: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (div Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (div Expr1 Expr)
< search. Subgoal 1.6: IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr true @ ============================ <is_expr {P}> true
< search. Subgoal 1.7: IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr false @ ============================ <is_expr {P}> false
< search. Subgoal 1.8: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (and Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (and Expr1 Expr)
< apply IH to R1. Subgoal 1.8: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (and Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (and Expr1 Expr)
< apply IH to R2. Subgoal 1.8: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (and Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (and Expr1 Expr)
< search. Subgoal 1.9: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (or Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (or Expr1 Expr)
< apply IH to R1. Subgoal 1.9: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (or Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (or Expr1 Expr)
< apply IH to R2. Subgoal 1.9: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (or Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (or Expr1 Expr)
< search. Subgoal 1.10: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (not Expr) @ R1 : is_expr Expr * ============================ <is_expr {P}> (not Expr)
< apply IH to R1. Subgoal 1.10: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (not Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (not Expr)
< search. Subgoal 1.11: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (greater Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (greater Expr1 Expr)
< apply IH to R1. Subgoal 1.11: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (greater Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (greater Expr1 Expr)
< apply IH to R2. Subgoal 1.11: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (greater Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (greater Expr1 Expr)
< search. Subgoal 1.12: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (eq Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (eq Expr1 Expr)
< apply IH to R1. Subgoal 1.12: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (eq Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (eq Expr1 Expr)
< apply IH to R2. Subgoal 1.12: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (eq Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (eq Expr1 Expr)
< search. Subgoal 1.13: Variables: S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (stringLit S) @ R1 : is_string S ============================ <is_expr {P}> (stringLit S)
< search. Subgoal 1.14: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (appString Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (appString Expr1 Expr)
< apply IH to R1. Subgoal 1.14: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (appString Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (appString Expr1 Expr)
< apply IH to R2. Subgoal 1.14: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (appString Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (appString Expr1 Expr)
< search. Subgoal 1.15: Variables: S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (name S) @ R1 : is_string S ============================ <is_expr {P}> (name S)
< search. Subgoal 1.16: Variables: Args S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (call S Args) @ R1 : is_string S R2 : is_args Args * ============================ <is_expr {P}> (call S Args)
< apply IH1 to R2. Subgoal 1.16: Variables: Args S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (call S Args) @ R1 : is_string S R2 : is_args Args * H1 : <is_args {P}> Args ============================ <is_expr {P}> (call S Args)
< search. Subgoal 1.17: Variables: Expr Stmt IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (stmtExpr Stmt Expr) @ R1 : is_stmt Stmt * R2 : is_expr Expr * ============================ <is_expr {P}> (stmtExpr Stmt Expr)
< apply IH3 to R1. Subgoal 1.17: Variables: Expr Stmt IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (stmtExpr Stmt Expr) @ R1 : is_stmt Stmt * R2 : is_expr Expr * H1 : <is_stmt {P}> Stmt ============================ <is_expr {P}> (stmtExpr Stmt Expr)
< apply IH to R2. Subgoal 1.17: Variables: Expr Stmt IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (stmtExpr Stmt Expr) @ R1 : is_stmt Stmt * R2 : is_expr Expr * H1 : <is_stmt {P}> Stmt H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (stmtExpr Stmt Expr)
< search. Subgoal 1.18: Variables: RecFieldExprs IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (recBuild RecFieldExprs) @ R1 : is_recFieldExprs RecFieldExprs * ============================ <is_expr {P}> (recBuild RecFieldExprs)
< apply IH2 to R1. Subgoal 1.18: Variables: RecFieldExprs IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (recBuild RecFieldExprs) @ R1 : is_recFieldExprs RecFieldExprs * H1 : <is_recFieldExprs {P}> RecFieldExprs ============================ <is_expr {P}> (recBuild RecFieldExprs)
< search. Subgoal 1.19: Variables: S Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (recFieldAccess Expr S) @ R1 : is_expr Expr * R2 : is_string S ============================ <is_expr {P}> (recFieldAccess Expr S)
< apply IH to R1. Subgoal 1.19: Variables: S Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (recFieldAccess Expr S) @ R1 : is_expr Expr * R2 : is_string S H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (recFieldAccess Expr S)
< search. Subgoal 1.20: Variables: Typ Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (errorExpr Expr Typ) @ R1 : is_expr Expr * R2 : is_typ Typ ============================ <is_expr {P}> (errorExpr Expr Typ)
< apply IH to R1. Subgoal 1.20: Variables: Typ Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (errorExpr Expr Typ) @ R1 : is_expr Expr * R2 : is_typ Typ H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (errorExpr Expr Typ)
< search. Subgoal 2.1: IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_args nilArgs @ ============================ <is_args {P}> nilArgs
< search. Subgoal 2.2: Variables: Args Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_args (consArgs Expr Args) @ R1 : is_expr Expr * R2 : is_args Args * ============================ <is_args {P}> (consArgs Expr Args)
< apply IH to R1. Subgoal 2.2: Variables: Args Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_args (consArgs Expr Args) @ R1 : is_expr Expr * R2 : is_args Args * H1 : <is_expr {P}> Expr ============================ <is_args {P}> (consArgs Expr Args)
< apply IH1 to R2. Subgoal 2.2: Variables: Args Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_args (consArgs Expr Args) @ R1 : is_expr Expr * R2 : is_args Args * H1 : <is_expr {P}> Expr H2 : <is_args {P}> Args ============================ <is_args {P}> (consArgs Expr Args)
< search. Subgoal 3.1: IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_recFieldExprs nilRecFieldExprs @ ============================ <is_recFieldExprs {P}> nilRecFieldExprs
< search. Subgoal 3.2: Variables: RecFieldExprs Expr S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ R1 : is_string S R2 : is_expr Expr * R3 : is_recFieldExprs RecFieldExprs * ============================ <is_recFieldExprs {P}> (consRecFieldExprs S Expr RecFieldExprs)
< apply IH to R2. Subgoal 3.2: Variables: RecFieldExprs Expr S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ R1 : is_string S R2 : is_expr Expr * R3 : is_recFieldExprs RecFieldExprs * H1 : <is_expr {P}> Expr ============================ <is_recFieldExprs {P}> (consRecFieldExprs S Expr RecFieldExprs)
< apply IH2 to R3. Subgoal 3.2: Variables: RecFieldExprs Expr S IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ R1 : is_string S R2 : is_expr Expr * R3 : is_recFieldExprs RecFieldExprs * H1 : <is_expr {P}> Expr H2 : <is_recFieldExprs {P}> RecFieldExprs ============================ <is_recFieldExprs {P}> (consRecFieldExprs S Expr RecFieldExprs)
< search. Subgoal 4.1: IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt noop @ ============================ <is_stmt {P}> noop
< search. Subgoal 4.2: Variables: Stmt Stmt1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (seq Stmt1 Stmt) @ R1 : is_stmt Stmt1 * R2 : is_stmt Stmt * ============================ <is_stmt {P}> (seq Stmt1 Stmt)
< apply IH3 to R1. Subgoal 4.2: Variables: Stmt Stmt1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (seq Stmt1 Stmt) @ R1 : is_stmt Stmt1 * R2 : is_stmt Stmt * H1 : <is_stmt {P}> Stmt1 ============================ <is_stmt {P}> (seq Stmt1 Stmt)
< apply IH3 to R2. Subgoal 4.2: Variables: Stmt Stmt1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (seq Stmt1 Stmt) @ R1 : is_stmt Stmt1 * R2 : is_stmt Stmt * H1 : <is_stmt {P}> Stmt1 H2 : <is_stmt {P}> Stmt ============================ <is_stmt {P}> (seq Stmt1 Stmt)
< search. Subgoal 4.3: Variables: Expr S1 Typ IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (declare Typ S1 Expr) @ R1 : is_typ Typ R2 : is_string S1 R3 : is_expr Expr * ============================ <is_stmt {P}> (declare Typ S1 Expr)
< apply IH to R3. Subgoal 4.3: Variables: Expr S1 Typ IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (declare Typ S1 Expr) @ R1 : is_typ Typ R2 : is_string S1 R3 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (declare Typ S1 Expr)
< search. Subgoal 4.4: Variables: Expr S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (assign S1 Expr) @ R1 : is_string S1 R2 : is_expr Expr * ============================ <is_stmt {P}> (assign S1 Expr)
< apply IH to R2. Subgoal 4.4: Variables: Expr S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (assign S1 Expr) @ R1 : is_string S1 R2 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (assign S1 Expr)
< search. Subgoal 4.5: Variables: Expr L S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (recUpdate S1 L Expr) @ R1 : is_string S1 R2 : is_list is_string L R3 : is_expr Expr * ============================ <is_stmt {P}> (recUpdate S1 L Expr)
< apply IH to R3. Subgoal 4.5: Variables: Expr L S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (recUpdate S1 L Expr) @ R1 : is_string S1 R2 : is_list is_string L R3 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (recUpdate S1 L Expr)
< search. Subgoal 4.6: Variables: Stmt Stmt1 Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (ifThenElse Expr Stmt1 Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt1 * R3 : is_stmt Stmt * ============================ <is_stmt {P}> (ifThenElse Expr Stmt1 Stmt)
< apply IH to R1. Subgoal 4.6: Variables: Stmt Stmt1 Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (ifThenElse Expr Stmt1 Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt1 * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (ifThenElse Expr Stmt1 Stmt)
< apply IH3 to R2. Subgoal 4.6: Variables: Stmt Stmt1 Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (ifThenElse Expr Stmt1 Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt1 * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr H2 : <is_stmt {P}> Stmt1 ============================ <is_stmt {P}> (ifThenElse Expr Stmt1 Stmt)
< apply IH3 to R3. Subgoal 4.6: Variables: Stmt Stmt1 Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (ifThenElse Expr Stmt1 Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt1 * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr H2 : <is_stmt {P}> Stmt1 H3 : <is_stmt {P}> Stmt ============================ <is_stmt {P}> (ifThenElse Expr Stmt1 Stmt)
< search. Subgoal 4.7: Variables: Stmt Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (while Expr Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt * ============================ <is_stmt {P}> (while Expr Stmt)
< apply IH to R1. Subgoal 4.7: Variables: Stmt Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (while Expr Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (while Expr Stmt)
< apply IH3 to R2. Subgoal 4.7: Variables: Stmt Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (while Expr Stmt) @ R1 : is_expr Expr * R2 : is_stmt Stmt * H1 : <is_expr {P}> Expr H2 : <is_stmt {P}> Stmt ============================ <is_stmt {P}> (while Expr Stmt)
< search. Subgoal 4.8: Variables: Stmt IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (scopeStmt Stmt) @ R1 : is_stmt Stmt * ============================ <is_stmt {P}> (scopeStmt Stmt)
< apply IH3 to R1. Subgoal 4.8: Variables: Stmt IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (scopeStmt Stmt) @ R1 : is_stmt Stmt * H1 : <is_stmt {P}> Stmt ============================ <is_stmt {P}> (scopeStmt Stmt)
< search. Subgoal 4.9: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (printVal Expr) @ R1 : is_expr Expr * ============================ <is_stmt {P}> (printVal Expr)
< apply IH to R1. Subgoal 4.9: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (printVal Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (printVal Expr)
< search. Proof completed.
< Extensible_Theorem is_args_nilArgs_or_consArgs : forall A, Is : is_args A -> A = nilArgs \/ (exists E A', A = consArgs E A') on Is. Subgoal 1: IH : forall A, is_args A * -> A = nilArgs \/ (exists E A', A = consArgs E A') Is : is_args nilArgs @ ============================ nilArgs = nilArgs \/ (exists E A', nilArgs = consArgs E A')
< search. Subgoal 2: Variables: Args Expr IH : forall A, is_args A * -> A = nilArgs \/ (exists E A', A = consArgs E A') Is : is_args (consArgs Expr Args) @ Is1 : is_expr Expr * Is2 : is_args Args * ============================ consArgs Expr Args = nilArgs \/ (exists E A', consArgs Expr Args = consArgs E A')
< search. Proof completed.
< Extensible_Theorem is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs : forall RF, Is : is_recFieldExprs RF -> RF = nilRecFieldExprs \/ (exists F E RF', RF = consRecFieldExprs F E RF') on Is. Subgoal 1: IH : forall RF, is_recFieldExprs RF * -> RF = nilRecFieldExprs \/ (exists F E RF', RF = consRecFieldExprs F E RF') Is : is_recFieldExprs nilRecFieldExprs @ ============================ nilRecFieldExprs = nilRecFieldExprs \/ (exists F E RF', nilRecFieldExprs = consRecFieldExprs F E RF')
< search. Subgoal 2: Variables: RecFieldExprs Expr S IH : forall RF, is_recFieldExprs RF * -> RF = nilRecFieldExprs \/ (exists F E RF', RF = consRecFieldExprs F E RF') Is : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ Is1 : is_string S Is2 : is_expr Expr * Is3 : is_recFieldExprs RecFieldExprs * ============================ consRecFieldExprs S Expr RecFieldExprs = nilRecFieldExprs \/ (exists F E RF', consRecFieldExprs S Expr RecFieldExprs = consRecFieldExprs F E RF')
< search. Proof completed.
< Theorem lookupScopes_unique [Key, Item] : forall L (K : Key) (I2 : Item) (I1 : Item), lookupScopes K L I1 -> lookupScopes K L I2 -> I1 = I2. ============================ forall L K I2 I1, lookupScopes K L I1 -> lookupScopes K L I2 -> I1 = I2
< induction on 1. IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 ============================ forall L K I2 I1, lookupScopes K L I1 @ -> lookupScopes K L I2 -> I1 = I2
< intros LkpA LkpB. Variables: L K I2 I1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : lookupScopes K L I1 @ LkpB : lookupScopes K L I2 ============================ I1 = I2
< LkpA: case LkpA. Subgoal 1: Variables: K I2 I1 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpB : lookupScopes K (L1::Rest) I2 LkpA : lookup L1 K I1 ============================ I1 = I2
< LkpB: case LkpB. Subgoal 1.1: Variables: K I2 I1 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : lookup L1 K I1 LkpB : lookup L1 K I2 ============================ I1 = I2
< apply lookup_unique to LkpA LkpB. Subgoal 1.1: Variables: K I2 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : lookup L1 K I2 LkpB : lookup L1 K I2 ============================ I2 = I2
< search. Subgoal 1.2: Variables: K I2 I1 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : lookup L1 K I1 LkpB : no_lookup L1 K LkpB1 : lookupScopes K Rest I2 ============================ I1 = I2
< apply no_lookup to LkpB LkpA. Subgoal 2: Variables: K I2 I1 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpB : lookupScopes K (L1::Rest) I2 LkpA : no_lookup L1 K LkpA1 : lookupScopes K Rest I1 * ============================ I1 = I2
< LkpB: case LkpB. Subgoal 2.1: Variables: K I2 I1 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : no_lookup L1 K LkpA1 : lookupScopes K Rest I1 * LkpB : lookup L1 K I2 ============================ I1 = I2
< apply no_lookup to LkpA LkpB. Subgoal 2.2: Variables: K I2 I1 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : no_lookup L1 K LkpA1 : lookupScopes K Rest I1 * LkpB : no_lookup L1 K LkpB1 : lookupScopes K Rest I2 ============================ I1 = I2
< apply IH to LkpA1 LkpB1. Subgoal 2.2: Variables: K I2 Rest L1 IH : forall L K I2 I1, lookupScopes K L I1 * -> lookupScopes K L I2 -> I1 = I2 LkpA : no_lookup L1 K LkpA1 : lookupScopes K Rest I2 * LkpB : no_lookup L1 K LkpB1 : lookupScopes K Rest I2 ============================ I2 = I2
< search. Proof completed.
< Theorem lookupScopes_names [K, V] : forall Ctx (X : K) (V : V) Names, lookupScopes X Ctx V -> names Ctx Names -> mem X Names. ============================ forall Ctx X V Names, lookupScopes X Ctx V -> names Ctx Names -> mem X Names
< induction on 1. IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names ============================ forall Ctx X V Names, lookupScopes X Ctx V @ -> names Ctx Names -> mem X Names
< intros L N. Variables: Ctx X V Names IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : lookupScopes X Ctx V @ N : names Ctx Names ============================ mem X Names
< L: case L. Subgoal 1: Variables: X V Names Rest L IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names N : names (L::Rest) Names L : lookup L X V ============================ mem X Names
< N: case N. Subgoal 1: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : lookup L X V N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names ============================ mem X Names
< M: apply lookup_mem to L. Subgoal 1: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : lookup L X V N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem (X, V) L ============================ mem X Names
< M': apply domain_mem to M N. Subgoal 1: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : lookup L X V N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem (X, V) L M' : mem X NScope ============================ mem X Names
< apply mem_append_left to M' N2. Subgoal 1: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : lookup L X V N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem (X, V) L M' : mem X NScope H1 : mem X Names ============================ mem X Names
< search. Subgoal 2: Variables: X V Names Rest L IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names N : names (L::Rest) Names L : no_lookup L X L1 : lookupScopes X Rest V * ============================ mem X Names
< N: case N. Subgoal 2: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : no_lookup L X L1 : lookupScopes X Rest V * N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names ============================ mem X Names
< M: apply IH to L1 N1. Subgoal 2: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : no_lookup L X L1 : lookupScopes X Rest V * N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem X NRest ============================ mem X Names
< apply mem_append_right to M N2. Subgoal 2: Variables: X V Names Rest L NScope NRest IH : forall Ctx X V Names, lookupScopes X Ctx V * -> names Ctx Names -> mem X Names L : no_lookup L X L1 : lookupScopes X Rest V * N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem X NRest H1 : mem X Names ============================ mem X Names
< search. Proof completed.
< Theorem lookup_after_dual_select [Key, Item] : forall (K : Key) (X : Key) (V1 : Item) (V2 : Item) (I1 : Item) (I2 : Item) L R1 R2, select (K, V1) R1 L -> select (K, V2) R2 L -> (K = X -> false) -> lookup R1 X I1 -> lookup R2 X I2 -> I1 = I2. ============================ forall K X V1 V2 I1 I2 L R1 R2, select (K, V1) R1 L -> select (K, V2) R2 L -> (K = X -> false) -> lookup R1 X I1 -> lookup R2 X I2 -> I1 = I2
< intros SlctA SlctB NEq LkpA LkpB. Variables: K X V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I1 LkpB : lookup R2 X I2 ============================ I1 = I2
< assert X = K -> false. Subgoal 1: Variables: K X V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I1 LkpB : lookup R2 X I2 ============================ X = K -> false
< intros E. Subgoal 1: Variables: K X V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I1 LkpB : lookup R2 X I2 E : X = K ============================ false
< case E. Subgoal 1: Variables: K V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = K -> false LkpA : lookup R1 K I1 LkpB : lookup R2 K I2 ============================ false
< backchain NEq. Variables: K X V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I1 LkpB : lookup R2 X I2 H1 : X = K -> false ============================ I1 = I2
< LkpLA: apply lookup_after_select_before to LkpA SlctA _. Variables: K X V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I1 LkpB : lookup R2 X I2 H1 : X = K -> false LkpLA : lookup L X I1 ============================ I1 = I2
< LkpLB: apply lookup_after_select_before to LkpB SlctB _. Variables: K X V1 V2 I1 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I1 LkpB : lookup R2 X I2 H1 : X = K -> false LkpLA : lookup L X I1 LkpLB : lookup L X I2 ============================ I1 = I2
< apply lookup_unique to LkpLA LkpLB. Variables: K X V1 V2 I2 L R1 R2 SlctA : select (K, V1) R1 L SlctB : select (K, V2) R2 L NEq : K = X -> false LkpA : lookup R1 X I2 LkpB : lookup R2 X I2 H1 : X = K -> false LkpLA : lookup L X I2 LkpLB : lookup L X I2 ============================ I2 = I2
< search. Proof completed.
< Theorem remove_all_unique [Key, Item] : forall (L : list (pair Key Item)) X A B, remove_all L X A -> remove_all L X B -> A = B. ============================ forall L X A B, remove_all L X A -> remove_all L X B -> A = B
< induction on 1. IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B ============================ forall L X A B, remove_all L X A @ -> remove_all L X B -> A = B
< intros RA RB. Variables: L X A B IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : remove_all L X A @ RB : remove_all L X B ============================ A = B
< RA: case RA. Subgoal 1: Variables: X B IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RB : remove_all [] X B ============================ [] = B
< case RB. Subgoal 1: Variables: X IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B ============================ [] = []
< search. Subgoal 2: Variables: X A B Rest Item IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RB : remove_all ((X, Item)::Rest) X B RA : remove_all Rest X A * ============================ A = B
< RB: case RB. Subgoal 2.1: Variables: X A B Rest Item IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : remove_all Rest X A * RB : remove_all Rest X B ============================ A = B
< apply IH to RA RB. Subgoal 2.1: Variables: X B Rest Item IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : remove_all Rest X B * RB : remove_all Rest X B ============================ B = B
< search. Subgoal 2.2: Variables: X A Rest Item R IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : remove_all Rest X A * RB : X = X -> false RB1 : remove_all Rest X R ============================ A = (X, Item)::R
< apply RB to _. Subgoal 3: Variables: X B R Item K Rest IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RB : remove_all ((K, Item)::Rest) X B RA : K = X -> false RA1 : remove_all Rest X R * ============================ (K, Item)::R = B
< RB: case RB. Subgoal 3.1: Variables: X B R Item Rest IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : X = X -> false RA1 : remove_all Rest X R * RB : remove_all Rest X B ============================ (X, Item)::R = B
< apply RA to _. Subgoal 3.2: Variables: X R Item K Rest R1 IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : K = X -> false RA1 : remove_all Rest X R * RB : K = X -> false RB1 : remove_all Rest X R1 ============================ (K, Item)::R = (K, Item)::R1
< apply IH to RA1 RB1. Subgoal 3.2: Variables: X Item K Rest R1 IH : forall L X A B, remove_all L X A * -> remove_all L X B -> A = B RA : K = X -> false RA1 : remove_all Rest X R1 * RB : K = X -> false RB1 : remove_all Rest X R1 ============================ (K, Item)::R1 = (K, Item)::R1
< search. Proof completed.
< Theorem replaceScopes_unique [Key, Item] : forall X V (L : list (list (pair Key Item))) RA RB, replaceScopes X V L RA -> replaceScopes X V L RB -> RA = RB. ============================ forall X V L RA RB, replaceScopes X V L RA -> replaceScopes X V L RB -> RA = RB
< induction on 1. IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB ============================ forall X V L RA RB, replaceScopes X V L RA @ -> replaceScopes X V L RB -> RA = RB
< intros RA RB. Variables: X V L RA RB IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : replaceScopes X V L RA @ RB : replaceScopes X V L RB ============================ RA = RB
< RA: case RA. Subgoal 1: Variables: X V RB I Rest LRemain L1 IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RB : replaceScopes X V (L1::Rest) RB RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain ============================ ((X, V)::LRemain)::Rest = RB
< RB: case RB. Subgoal 1.1: Variables: X V I Rest LRemain L1 I1 LRemain1 IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 ============================ ((X, V)::LRemain)::Rest = ((X, V)::LRemain1)::Rest
< apply remove_all_unique to RA1 RB1. Subgoal 1.1: Variables: X V I Rest L1 I1 LRemain1 IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain1 RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 ============================ ((X, V)::LRemain1)::Rest = ((X, V)::LRemain1)::Rest
< search. Subgoal 1.2: Variables: X V I Rest LRemain L1 New IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : no_lookup L1 X RB1 : replaceScopes X V Rest New ============================ ((X, V)::LRemain)::Rest = L1::New
< apply no_lookup_mem to RB RA. Subgoal 2: Variables: X V RB New L1 Rest IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RB : replaceScopes X V (L1::Rest) RB RA : no_lookup L1 X RA1 : replaceScopes X V Rest New * ============================ L1::New = RB
< RB: case RB. Subgoal 2.1: Variables: X V New L1 Rest I LRemain IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : no_lookup L1 X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain ============================ L1::New = ((X, V)::LRemain)::Rest
< apply no_lookup_mem to RA RB. Subgoal 2.2: Variables: X V New L1 Rest New1 IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : no_lookup L1 X RA1 : replaceScopes X V Rest New * RB : no_lookup L1 X RB1 : replaceScopes X V Rest New1 ============================ L1::New = L1::New1
< apply IH to RA1 RB1. Subgoal 2.2: Variables: X V L1 Rest New1 IH : forall X V L RA RB, replaceScopes X V L RA * -> replaceScopes X V L RB -> RA = RB RA : no_lookup L1 X RA1 : replaceScopes X V Rest New1 * RB : no_lookup L1 X RB1 : replaceScopes X V Rest New1 ============================ L1::New1 = L1::New1
< search. Proof completed.
< Theorem replaceScopes_names [K, V] : forall Ctx (X : K) (V : V) Names R, replaceScopes X V Ctx R -> names Ctx Names -> mem X Names. ============================ forall Ctx X V Names R, replaceScopes X V Ctx R -> names Ctx Names -> mem X Names
< induction on 1. IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names ============================ forall Ctx X V Names R, replaceScopes X V Ctx R @ -> names Ctx Names -> mem X Names
< intros R N. Variables: Ctx X V Names R IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : replaceScopes X V Ctx R @ N : names Ctx Names ============================ mem X Names
< R: case R. Subgoal 1: Variables: X V Names I Rest LRemain L IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names N : names (L::Rest) Names R : mem (X, I) L R1 : remove_all L X LRemain ============================ mem X Names
< N: case N. Subgoal 1: Variables: X V Names I Rest LRemain L NScope NRest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : mem (X, I) L R1 : remove_all L X LRemain N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names ============================ mem X Names
< M: apply domain_mem to R N. Subgoal 1: Variables: X V Names I Rest LRemain L NScope NRest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : mem (X, I) L R1 : remove_all L X LRemain N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem X NScope ============================ mem X Names
< apply mem_append_left to M N2. Subgoal 1: Variables: X V Names I Rest LRemain L NScope NRest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : mem (X, I) L R1 : remove_all L X LRemain N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem X NScope H1 : mem X Names ============================ mem X Names
< search. Subgoal 2: Variables: X V Names New L Rest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names N : names (L::Rest) Names R : no_lookup L X R1 : replaceScopes X V Rest New * ============================ mem X Names
< N: case N. Subgoal 2: Variables: X V Names New L Rest NScope NRest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : no_lookup L X R1 : replaceScopes X V Rest New * N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names ============================ mem X Names
< M: apply IH to R1 N1. Subgoal 2: Variables: X V Names New L Rest NScope NRest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : no_lookup L X R1 : replaceScopes X V Rest New * N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem X NRest ============================ mem X Names
< apply mem_append_right to M N2. Subgoal 2: Variables: X V Names New L Rest NScope NRest IH : forall Ctx X V Names R, replaceScopes X V Ctx R * -> names Ctx Names -> mem X Names R : no_lookup L X R1 : replaceScopes X V Rest New * N : domain L NScope N1 : names Rest NRest N2 : NScope ++ NRest = Names M : mem X NRest H1 : mem X Names ============================ mem X Names
< search. Proof completed.
< Theorem remove_all_names [K, V] : forall (X : K) (L : list (pair K V)) (R : list (pair K V)) NL NR Z, remove_all L X R -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR. ============================ forall X L R NL NR Z, remove_all L X R -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR
< induction on 1. IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR ============================ forall X L R NL NR Z, remove_all L X R @ -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR
< intros RA LD RD M NEq. Variables: X L R NL NR Z IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RA : remove_all L X R @ LD : domain L NL RD : domain R NR M : mem Z NL NEq : X = Z -> false ============================ mem Z NR
< RA: case RA. Subgoal 1: Variables: X NL NR Z IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR LD : domain [] NL RD : domain [] NR M : mem Z NL NEq : X = Z -> false ============================ mem Z NR
< case LD. Subgoal 1: Variables: X NR Z IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RD : domain [] NR M : mem Z [] NEq : X = Z -> false ============================ mem Z NR
< case M. Subgoal 2: Variables: X R NL NR Z Rest Item IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR LD : domain ((X, Item)::Rest) NL RD : domain R NR M : mem Z NL NEq : X = Z -> false RA : remove_all Rest X R * ============================ mem Z NR
< LD: case LD. Subgoal 2: Variables: X R NR Z Rest Item DRest IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RD : domain R NR M : mem Z (X::DRest) NEq : X = Z -> false RA : remove_all Rest X R * LD : domain Rest DRest ============================ mem Z NR
< M: case M. Subgoal 2.1: Variables: X R NR Rest Item DRest IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RD : domain R NR NEq : X = X -> false RA : remove_all Rest X R * LD : domain Rest DRest ============================ mem X NR
< apply NEq to _. Subgoal 2.2: Variables: X R NR Z Rest Item DRest IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RD : domain R NR NEq : X = Z -> false RA : remove_all Rest X R * LD : domain Rest DRest M : mem Z DRest ============================ mem Z NR
< apply IH to RA LD RD _ NEq. Subgoal 2.2: Variables: X R NR Z Rest Item DRest IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RD : domain R NR NEq : X = Z -> false RA : remove_all Rest X R * LD : domain Rest DRest M : mem Z DRest H1 : mem Z NR ============================ mem Z NR
< search. Subgoal 3: Variables: X NL NR Z R1 Item K Rest IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR LD : domain ((K, Item)::Rest) NL RD : domain ((K, Item)::R1) NR M : mem Z NL NEq : X = Z -> false RA : K = X -> false RA1 : remove_all Rest X R1 * ============================ mem Z NR
< LD: case LD. Subgoal 3: Variables: X NR Z R1 Item K Rest DRest IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR RD : domain ((K, Item)::R1) NR M : mem Z (K::DRest) NEq : X = Z -> false RA : K = X -> false RA1 : remove_all Rest X R1 * LD : domain Rest DRest ============================ mem Z NR
< RD: case RD. Subgoal 3: Variables: X Z R1 Item K Rest DRest DRest1 IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR M : mem Z (K::DRest) NEq : X = Z -> false RA : K = X -> false RA1 : remove_all Rest X R1 * LD : domain Rest DRest RD : domain R1 DRest1 ============================ mem Z (K::DRest1)
< M: case M. Subgoal 3.1: Variables: X R1 Item K Rest DRest DRest1 IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR NEq : X = K -> false RA : K = X -> false RA1 : remove_all Rest X R1 * LD : domain Rest DRest RD : domain R1 DRest1 ============================ mem K (K::DRest1)
< search. Subgoal 3.2: Variables: X Z R1 Item K Rest DRest DRest1 IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR NEq : X = Z -> false RA : K = X -> false RA1 : remove_all Rest X R1 * LD : domain Rest DRest RD : domain R1 DRest1 M : mem Z DRest ============================ mem Z (K::DRest1)
< apply IH to RA1 LD RD M NEq. Subgoal 3.2: Variables: X Z R1 Item K Rest DRest DRest1 IH : forall X L R NL NR Z, remove_all L X R * -> domain L NL -> domain R NR -> mem Z NL -> (X = Z -> false) -> mem Z NR NEq : X = Z -> false RA : K = X -> false RA1 : remove_all Rest X R1 * LD : domain Rest DRest RD : domain R1 DRest1 M : mem Z DRest H1 : mem Z DRest1 ============================ mem Z (K::DRest1)
< search. Proof completed.
< Theorem mem_after_remove_all_before [K, V] : forall L R X (Z : pair K V), remove_all L X R -> mem Z R -> mem Z L. ============================ forall L R X Z, remove_all L X R -> mem Z R -> mem Z L
< induction on 1. IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L ============================ forall L R X Z, remove_all L X R @ -> mem Z R -> mem Z L
< intros R M. Variables: L R X Z IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L R : remove_all L X R @ M : mem Z R ============================ mem Z L
< R: case R. Subgoal 1: Variables: X Z IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L M : mem Z [] ============================ mem Z []
< case M. Subgoal 2: Variables: R X Z Rest Item IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L M : mem Z R R : remove_all Rest X R * ============================ mem Z ((X, Item)::Rest)
< apply IH to R M. Subgoal 2: Variables: R X Z Rest Item IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L M : mem Z R R : remove_all Rest X R * H1 : mem Z Rest ============================ mem Z ((X, Item)::Rest)
< search. Subgoal 3: Variables: X Z R1 Item K Rest IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L M : mem Z ((K, Item)::R1) R : K = X -> false R1 : remove_all Rest X R1 * ============================ mem Z ((K, Item)::Rest)
< M: case M. Subgoal 3.1: Variables: X R1 Item K Rest IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L R : K = X -> false R1 : remove_all Rest X R1 * ============================ mem (K, Item) ((K, Item)::Rest)
< search. Subgoal 3.2: Variables: X Z R1 Item K Rest IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L R : K = X -> false R1 : remove_all Rest X R1 * M : mem Z R1 ============================ mem Z ((K, Item)::Rest)
< apply IH to R1 M. Subgoal 3.2: Variables: X Z R1 Item K Rest IH : forall L R X Z, remove_all L X R * -> mem Z R -> mem Z L R : K = X -> false R1 : remove_all Rest X R1 * M : mem Z R1 H1 : mem Z Rest ============================ mem Z ((K, Item)::Rest)
< search. Proof completed.
< Theorem mem_before_remove_all_after [K, V] : forall L R X (K : K) (V : V), remove_all L X R -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R. ============================ forall L R X K V, remove_all L X R -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R
< induction on 1. IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R ============================ forall L R X K V, remove_all L X R @ -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R
< intros R M NEq. Variables: L R X K V IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R R : remove_all L X R @ M : mem (K, V) L NEq : K = X -> false ============================ mem (K, V) R
< R: case R. Subgoal 1: Variables: X K V IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R M : mem (K, V) [] NEq : K = X -> false ============================ mem (K, V) []
< case M. Subgoal 2: Variables: R X K V Rest Item IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R M : mem (K, V) ((X, Item)::Rest) NEq : K = X -> false R : remove_all Rest X R * ============================ mem (K, V) R
< M: case M. Subgoal 2.1: Variables: R X Rest Item IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R NEq : X = X -> false R : remove_all Rest X R * ============================ mem (X, Item) R
< apply NEq to _. Subgoal 2.2: Variables: R X K V Rest Item IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R NEq : K = X -> false R : remove_all Rest X R * M : mem (K, V) Rest ============================ mem (K, V) R
< apply IH to R M NEq. Subgoal 2.2: Variables: R X K V Rest Item IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R NEq : K = X -> false R : remove_all Rest X R * M : mem (K, V) Rest H1 : mem (K, V) R ============================ mem (K, V) R
< search. Subgoal 3: Variables: X K V R1 Item K1 Rest IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R M : mem (K, V) ((K1, Item)::Rest) NEq : K = X -> false R : K1 = X -> false R1 : remove_all Rest X R1 * ============================ mem (K, V) ((K1, Item)::R1)
< M: case M. Subgoal 3.1: Variables: X R1 Item K1 Rest IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R NEq : K1 = X -> false R : K1 = X -> false R1 : remove_all Rest X R1 * ============================ mem (K1, Item) ((K1, Item)::R1)
< search. Subgoal 3.2: Variables: X K V R1 Item K1 Rest IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R NEq : K = X -> false R : K1 = X -> false R1 : remove_all Rest X R1 * M : mem (K, V) Rest ============================ mem (K, V) ((K1, Item)::R1)
< apply IH to R1 M _. Subgoal 3.2: Variables: X K V R1 Item K1 Rest IH : forall L R X K V, remove_all L X R * -> mem (K, V) L -> (K = X -> false) -> mem (K, V) R NEq : K = X -> false R : K1 = X -> false R1 : remove_all Rest X R1 * M : mem (K, V) Rest H1 : mem (K, V) R1 ============================ mem (K, V) ((K1, Item)::R1)
< search. Proof completed.
< Theorem names_unique [K, V] : forall (L : list (list (pair K V))) NA NB, names L NA -> names L NB -> NA = NB. ============================ forall L NA NB, names L NA -> names L NB -> NA = NB
< induction on 1. IH : forall L NA NB, names L NA * -> names L NB -> NA = NB ============================ forall L NA NB, names L NA @ -> names L NB -> NA = NB
< intros NA NB. Variables: L NA NB IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NA : names L NA @ NB : names L NB ============================ NA = NB
< NA: case NA. Subgoal 1: Variables: NB IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NB : names [] NB ============================ [] = NB
< case NB. Subgoal 1: IH : forall L NA NB, names L NA * -> names L NB -> NA = NB ============================ [] = []
< search. Subgoal 2: Variables: NA NB NScope NRest Rest Scope IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NB : names (Scope::Rest) NB NA : domain Scope NScope NA1 : names Rest NRest * NA2 : NScope ++ NRest = NA ============================ NA = NB
< NB: case NB. Subgoal 2: Variables: NA NB NScope NRest Rest Scope NScope1 NRest1 IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NA : domain Scope NScope NA1 : names Rest NRest * NA2 : NScope ++ NRest = NA NB : domain Scope NScope1 NB1 : names Rest NRest1 NB2 : NScope1 ++ NRest1 = NB ============================ NA = NB
< apply IH to NA1 NB1. Subgoal 2: Variables: NA NB NScope Rest Scope NScope1 NRest1 IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NA : domain Scope NScope NA1 : names Rest NRest1 * NA2 : NScope ++ NRest1 = NA NB : domain Scope NScope1 NB1 : names Rest NRest1 NB2 : NScope1 ++ NRest1 = NB ============================ NA = NB
< apply domain_unique to NA NB. Subgoal 2: Variables: NA NB Rest Scope NScope1 NRest1 IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NA : domain Scope NScope1 NA1 : names Rest NRest1 * NA2 : NScope1 ++ NRest1 = NA NB : domain Scope NScope1 NB1 : names Rest NRest1 NB2 : NScope1 ++ NRest1 = NB ============================ NA = NB
< apply append_unique to NA2 NB2. Subgoal 2: Variables: NB Rest Scope NScope1 NRest1 IH : forall L NA NB, names L NA * -> names L NB -> NA = NB NA : domain Scope NScope1 NA1 : names Rest NRest1 * NA2 : NScope1 ++ NRest1 = NB NB : domain Scope NScope1 NB1 : names Rest NRest1 NB2 : NScope1 ++ NRest1 = NB ============================ NB = NB
< search. Proof completed.
< Define lookup_all_scopes : (list (list (pair (string) Item))) -> (list (list (pair (string) Item))) -> prop by lookup_all_scopes [] []; lookup_all_scopes (A::ARest) (B::BRest) := ((forall X V, lookup A X V -> lookup B X V) /\ (forall X, is_string X -> no_lookup A X -> no_lookup B X)) /\ lookup_all_scopes ARest BRest.
< Theorem lookup_all_scopes_lookupScopes [Item] : forall A B X (V : Item), is_string X -> lookup_all_scopes A B -> lookupScopes X A V -> lookupScopes X B V. ============================ forall A B X V, is_string X -> lookup_all_scopes A B -> lookupScopes X A V -> lookupScopes X B V
< induction on 2. IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V ============================ forall A B X V, is_string X -> lookup_all_scopes A B @ -> lookupScopes X A V -> lookupScopes X B V
< intros IsX LAS LS. Variables: A B X V IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LAS : lookup_all_scopes A B @ LS : lookupScopes X A V ============================ lookupScopes X B V
< LAS: case LAS. Subgoal 1: Variables: X V IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LS : lookupScopes X [] V ============================ lookupScopes X [] V
< case LS. Subgoal 2: Variables: X V BRest B1 ARest A1 IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LS : lookupScopes X (A1::ARest) V LAS : forall X V, lookup A1 X V -> lookup B1 X V LAS1 : forall X, is_string X -> no_lookup A1 X -> no_lookup B1 X LAS2 : lookup_all_scopes ARest BRest * ============================ lookupScopes X (B1::BRest) V
< LS: case LS. Subgoal 2.1: Variables: X V BRest B1 ARest A1 IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LAS : forall X V, lookup A1 X V -> lookup B1 X V LAS1 : forall X, is_string X -> no_lookup A1 X -> no_lookup B1 X LAS2 : lookup_all_scopes ARest BRest * LS : lookup A1 X V ============================ lookupScopes X (B1::BRest) V
< apply LAS to LS. Subgoal 2.1: Variables: X V BRest B1 ARest A1 IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LAS : forall X V, lookup A1 X V -> lookup B1 X V LAS1 : forall X, is_string X -> no_lookup A1 X -> no_lookup B1 X LAS2 : lookup_all_scopes ARest BRest * LS : lookup A1 X V H1 : lookup B1 X V ============================ lookupScopes X (B1::BRest) V
< search. Subgoal 2.2: Variables: X V BRest B1 ARest A1 IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LAS : forall X V, lookup A1 X V -> lookup B1 X V LAS1 : forall X, is_string X -> no_lookup A1 X -> no_lookup B1 X LAS2 : lookup_all_scopes ARest BRest * LS : no_lookup A1 X LS1 : lookupScopes X ARest V ============================ lookupScopes X (B1::BRest) V
< apply IH to _ LAS2 LS1. Subgoal 2.2: Variables: X V BRest B1 ARest A1 IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LAS : forall X V, lookup A1 X V -> lookup B1 X V LAS1 : forall X, is_string X -> no_lookup A1 X -> no_lookup B1 X LAS2 : lookup_all_scopes ARest BRest * LS : no_lookup A1 X LS1 : lookupScopes X ARest V H1 : lookupScopes X BRest V ============================ lookupScopes X (B1::BRest) V
< apply LAS1 to _ LS. Subgoal 2.2: Variables: X V BRest B1 ARest A1 IH : forall A B X V, is_string X -> lookup_all_scopes A B * -> lookupScopes X A V -> lookupScopes X B V IsX : is_string X LAS : forall X V, lookup A1 X V -> lookup B1 X V LAS1 : forall X, is_string X -> no_lookup A1 X -> no_lookup B1 X LAS2 : lookup_all_scopes ARest BRest * LS : no_lookup A1 X LS1 : lookupScopes X ARest V H1 : lookupScopes X BRest V H2 : no_lookup B1 X ============================ lookupScopes X (B1::BRest) V
< search. Proof completed.
< Theorem lookup_all_scopes_add [Item] : forall A B AS BS X (V : Item), lookup_all_scopes (AS::A) (BS::B) -> lookup_all_scopes (((X, V)::AS)::A) (((X, V)::BS)::B). ============================ forall A B AS BS X V, lookup_all_scopes (AS::A) (BS::B) -> lookup_all_scopes (((X, V)::AS)::A) (((X, V)::BS)::B)
< intros LAS. Variables: A B AS BS X V LAS : lookup_all_scopes (AS::A) (BS::B) ============================ lookup_all_scopes (((X, V)::AS)::A) (((X, V)::BS)::B)
< L: case LAS. Variables: A B AS BS X V L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B ============================ lookup_all_scopes (((X, V)::AS)::A) (((X, V)::BS)::B)
< unfold . Subgoal 1: Variables: A B AS BS X V L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B ============================ forall X1 V1, lookup ((X, V)::AS) X1 V1 -> lookup ((X, V)::BS) X1 V1
< intros Lkp. Subgoal 1: Variables: A B AS BS X V X1 V1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B Lkp : lookup ((X, V)::AS) X1 V1 ============================ lookup ((X, V)::BS) X1 V1
< Lkp: case Lkp. Subgoal 1.1: Variables: A B AS BS X1 V1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B ============================ lookup ((X1, V1)::BS) X1 V1
< search. Subgoal 1.2: Variables: A B AS BS X V X1 V1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B Lkp : X = X1 -> false Lkp1 : lookup AS X1 V1 ============================ lookup ((X, V)::BS) X1 V1
< apply L to Lkp1. Subgoal 1.2: Variables: A B AS BS X V X1 V1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B Lkp : X = X1 -> false Lkp1 : lookup AS X1 V1 H1 : lookup BS X1 V1 ============================ lookup ((X, V)::BS) X1 V1
< search. Subgoal 2: Variables: A B AS BS X V L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B ============================ forall X1, is_string X1 -> no_lookup ((X, V)::AS) X1 -> no_lookup ((X, V)::BS) X1
< intros X N. Subgoal 2: Variables: A B AS BS X V X1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B X : is_string X1 N : no_lookup ((X, V)::AS) X1 ============================ no_lookup ((X, V)::BS) X1
< N: case N. Subgoal 2: Variables: A B AS BS X V X1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B X : is_string X1 N : X = X1 -> false N1 : no_lookup AS X1 ============================ no_lookup ((X, V)::BS) X1
< apply L1 to _ N1. Subgoal 2: Variables: A B AS BS X V X1 L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B X : is_string X1 N : X = X1 -> false N1 : no_lookup AS X1 H1 : no_lookup BS X1 ============================ no_lookup ((X, V)::BS) X1
< search. Subgoal 3: Variables: A B AS BS X V L : forall X V, lookup AS X V -> lookup BS X V L1 : forall X, is_string X -> no_lookup AS X -> no_lookup BS X L2 : lookup_all_scopes A B ============================ lookup_all_scopes A B
< search. Proof completed.
< Define scopes_same : (list (list (pair (string) value))) -> (list (list (pair (string) value))) -> prop by scopes_same [] []; scopes_same (A::ARest) (B::BRest) := ((forall X V, lookup A X V -> lookup B X V) /\ (forall X V, lookup B X V -> lookup A X V)) /\ scopes_same ARest BRest.
< Theorem scopes_same_reflexive : forall L, is_list (is_list (is_pair is_string is_value)) L -> scopes_same L L. ============================ forall L, is_list (is_list (is_pair is_string is_value)) L -> scopes_same L L
< induction on 1. IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L ============================ forall L, is_list (is_list (is_pair is_string is_value)) L @ -> scopes_same L L
< intros IsL. Variables: L IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_list (is_pair is_string is_value)) L @ ============================ scopes_same L L
< IsL: case IsL. Subgoal 1: IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L ============================ scopes_same [] []
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * ============================ scopes_same (H::T) (H::T)
< unfold . Subgoal 2.1: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * ============================ forall X V, lookup H X V -> lookup H X V
< intros L. Subgoal 2.1: Variables: T H X V IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * L : lookup H X V ============================ lookup H X V
< search. Subgoal 2.2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * ============================ forall X V, lookup H X V -> lookup H X V
< intros L. Subgoal 2.2: Variables: T H X V IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * L : lookup H X V ============================ lookup H X V
< search. Subgoal 2.3: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * ============================ scopes_same T T
< apply IH to IsL1. Subgoal 2.3: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> scopes_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * H1 : scopes_same T T ============================ scopes_same T T
< search. Proof completed.
< Theorem scopes_same_trans : forall A B C, scopes_same A B -> scopes_same B C -> scopes_same A C. ============================ forall A B C, scopes_same A B -> scopes_same B C -> scopes_same A C
< induction on 1. IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C ============================ forall A B C, scopes_same A B @ -> scopes_same B C -> scopes_same A C
< intros AB BC. Variables: A B C IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : scopes_same A B @ BC : scopes_same B C ============================ scopes_same A C
< AB: case AB. Subgoal 1: Variables: C IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C BC : scopes_same [] C ============================ scopes_same [] C
< case BC. Subgoal 1: IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C ============================ scopes_same [] []
< search. Subgoal 2: Variables: C BRest B1 ARest A1 IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C BC : scopes_same (B1::BRest) C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * ============================ scopes_same (A1::ARest) C
< BC: case BC. Subgoal 2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 ============================ scopes_same (A1::ARest) (B2::BRest1)
< unfold . Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 ============================ forall X V, lookup A1 X V -> lookup B2 X V
< intros L. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X V IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 L : lookup A1 X V ============================ lookup B2 X V
< LB: apply AB to L. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X V IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 L : lookup A1 X V LB : lookup B1 X V ============================ lookup B2 X V
< apply BC to LB. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X V IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 L : lookup A1 X V LB : lookup B1 X V H1 : lookup B2 X V ============================ lookup B2 X V
< search. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 ============================ forall X V, lookup B2 X V -> lookup A1 X V
< intros L. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X V IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 L : lookup B2 X V ============================ lookup A1 X V
< LB: apply BC1 to L. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X V IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 L : lookup B2 X V LB : lookup B1 X V ============================ lookup A1 X V
< apply AB1 to LB. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X V IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 L : lookup B2 X V LB : lookup B1 X V H1 : lookup A1 X V ============================ lookup A1 X V
< search. Subgoal 2.3: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 ============================ scopes_same ARest BRest1
< apply IH to AB2 BC2. Subgoal 2.3: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, scopes_same A B * -> scopes_same B C -> scopes_same A C AB : forall X V, lookup A1 X V -> lookup B1 X V AB1 : forall X V, lookup B1 X V -> lookup A1 X V AB2 : scopes_same ARest BRest * BC : forall X V, lookup B1 X V -> lookup B2 X V BC1 : forall X V, lookup B2 X V -> lookup B1 X V BC2 : scopes_same BRest BRest1 H1 : scopes_same ARest BRest1 ============================ scopes_same ARest BRest1
< search. Proof completed.
< Theorem scopes_same_symm : forall A B, scopes_same A B -> scopes_same B A. ============================ forall A B, scopes_same A B -> scopes_same B A
< induction on 1. IH : forall A B, scopes_same A B * -> scopes_same B A ============================ forall A B, scopes_same A B @ -> scopes_same B A
< intros SS. Variables: A B IH : forall A B, scopes_same A B * -> scopes_same B A SS : scopes_same A B @ ============================ scopes_same B A
< SS: case SS. Subgoal 1: IH : forall A B, scopes_same A B * -> scopes_same B A ============================ scopes_same [] []
< search. Subgoal 2: Variables: BRest B1 ARest A1 IH : forall A B, scopes_same A B * -> scopes_same B A SS : forall X V, lookup A1 X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup A1 X V SS2 : scopes_same ARest BRest * ============================ scopes_same (B1::BRest) (A1::ARest)
< apply IH to SS2. Subgoal 2: Variables: BRest B1 ARest A1 IH : forall A B, scopes_same A B * -> scopes_same B A SS : forall X V, lookup A1 X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup A1 X V SS2 : scopes_same ARest BRest * H1 : scopes_same BRest ARest ============================ scopes_same (B1::BRest) (A1::ARest)
< unfold . Subgoal 2.1: Variables: BRest B1 ARest A1 IH : forall A B, scopes_same A B * -> scopes_same B A SS : forall X V, lookup A1 X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup A1 X V SS2 : scopes_same ARest BRest * H1 : scopes_same BRest ARest ============================ forall X V, lookup B1 X V -> lookup A1 X V
< search. Subgoal 2.2: Variables: BRest B1 ARest A1 IH : forall A B, scopes_same A B * -> scopes_same B A SS : forall X V, lookup A1 X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup A1 X V SS2 : scopes_same ARest BRest * H1 : scopes_same BRest ARest ============================ forall X V, lookup A1 X V -> lookup B1 X V
< search. Subgoal 2.3: Variables: BRest B1 ARest A1 IH : forall A B, scopes_same A B * -> scopes_same B A SS : forall X V, lookup A1 X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup A1 X V SS2 : scopes_same ARest BRest * H1 : scopes_same BRest ARest ============================ scopes_same BRest ARest
< search. Proof completed.
< Extensible_Theorem vars_unique : forall E V1 V2, IsE : is_expr E -> VarsA : vars E V1 -> VarsB : vars E V2 -> V1 = V2 on VarsAalso varsArgs_unique : forall A V1 V2, IsA : is_args A -> VarsA : varsArgs A V1 -> VarsB : varsArgs A V2 -> V1 = V2 on VarsA, varsRecFields_unique : forall RF V1 V2, IsRF : is_recFieldExprs RF -> VarsA : varsRecFields RF V1 -> VarsB : varsRecFields RF V2 -> V1 = V2 on VarsA. Subgoal 1.1: Variables: V2 I IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (num I) VarsA : vars (num I) [] @ VarsB : vars (num I) V2 ============================ [] = V2
< case VarsB. Subgoal 1.1: Variables: I IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (num I) VarsA : vars (num I) [] @ ============================ [] = []
< search. Subgoal 1.2: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (plus E1 E2) VarsA : vars (plus E1 E2) V1 @ VarsB : vars (plus E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.2: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (plus E1 E2) V1 @ VarsB : vars (plus E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.2: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (plus E1 E2) V1 @ VarsB : vars (plus E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.2: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (plus E1 E2) V1 @ VarsB : vars (plus E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.2: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (plus E1 E2) V1 @ VarsB : vars (plus E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.2: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (plus E1 E2) V2 @ VarsB : vars (plus E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.3: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (minus E1 E2) VarsA : vars (minus E1 E2) V1 @ VarsB : vars (minus E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.3: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (minus E1 E2) V1 @ VarsB : vars (minus E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.3: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (minus E1 E2) V1 @ VarsB : vars (minus E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.3: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (minus E1 E2) V1 @ VarsB : vars (minus E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.3: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (minus E1 E2) V1 @ VarsB : vars (minus E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.3: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (minus E1 E2) V2 @ VarsB : vars (minus E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.4: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (mult E1 E2) VarsA : vars (mult E1 E2) V1 @ VarsB : vars (mult E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.4: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (mult E1 E2) V1 @ VarsB : vars (mult E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.4: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (mult E1 E2) V1 @ VarsB : vars (mult E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.4: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (mult E1 E2) V1 @ VarsB : vars (mult E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.4: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (mult E1 E2) V1 @ VarsB : vars (mult E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.4: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (mult E1 E2) V2 @ VarsB : vars (mult E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.5: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (div E1 E2) VarsA : vars (div E1 E2) V1 @ VarsB : vars (div E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.5: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (div E1 E2) V1 @ VarsB : vars (div E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.5: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (div E1 E2) V1 @ VarsB : vars (div E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.5: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (div E1 E2) V1 @ VarsB : vars (div E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.5: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (div E1 E2) V1 @ VarsB : vars (div E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.5: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (div E1 E2) V2 @ VarsB : vars (div E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.6: Variables: V2 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr true VarsA : vars true [] @ VarsB : vars true V2 ============================ [] = V2
< case VarsB. Subgoal 1.6: IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr true VarsA : vars true [] @ ============================ [] = []
< search. Subgoal 1.7: Variables: V2 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr false VarsA : vars false [] @ VarsB : vars false V2 ============================ [] = V2
< case VarsB. Subgoal 1.7: IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr false VarsA : vars false [] @ ============================ [] = []
< search. Subgoal 1.8: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (and E1 E2) VarsA : vars (and E1 E2) V1 @ VarsB : vars (and E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.8: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (and E1 E2) V1 @ VarsB : vars (and E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.8: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (and E1 E2) V1 @ VarsB : vars (and E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.8: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (and E1 E2) V1 @ VarsB : vars (and E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.8: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (and E1 E2) V1 @ VarsB : vars (and E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.8: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (and E1 E2) V2 @ VarsB : vars (and E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.9: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (or E1 E2) VarsA : vars (or E1 E2) V1 @ VarsB : vars (or E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.9: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (or E1 E2) V1 @ VarsB : vars (or E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.9: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (or E1 E2) V1 @ VarsB : vars (or E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.9: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (or E1 E2) V1 @ VarsB : vars (or E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.9: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (or E1 E2) V1 @ VarsB : vars (or E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.9: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (or E1 E2) V2 @ VarsB : vars (or E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.10: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (not E1) VarsA : vars (not E1) V1 @ VarsB : vars (not E1) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.10: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (not E1) V1 @ VarsB : vars (not E1) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.10: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (not E1) V1 @ VarsB : vars (not E1) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 VarsB1 : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.10: Variables: V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (not E1) V2 @ VarsB : vars (not E1) V2 VarsA1 : vars E1 V2 * H1 : is_expr E1 VarsB1 : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.11: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (greater E1 E2) VarsA : vars (greater E1 E2) V1 @ VarsB : vars (greater E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.11: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (greater E1 E2) V1 @ VarsB : vars (greater E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.11: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (greater E1 E2) V1 @ VarsB : vars (greater E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.11: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (greater E1 E2) V1 @ VarsB : vars (greater E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.11: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (greater E1 E2) V1 @ VarsB : vars (greater E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.11: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (greater E1 E2) V2 @ VarsB : vars (greater E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.12: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (eq E1 E2) VarsA : vars (eq E1 E2) V1 @ VarsB : vars (eq E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.12: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (eq E1 E2) V1 @ VarsB : vars (eq E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.12: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (eq E1 E2) V1 @ VarsB : vars (eq E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.12: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (eq E1 E2) V1 @ VarsB : vars (eq E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.12: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (eq E1 E2) V1 @ VarsB : vars (eq E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.12: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (eq E1 E2) V2 @ VarsB : vars (eq E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.13: Variables: V2 S IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (stringLit S) VarsA : vars (stringLit S) [] @ VarsB : vars (stringLit S) V2 ============================ [] = V2
< case VarsB. Subgoal 1.13: Variables: S IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (stringLit S) VarsA : vars (stringLit S) [] @ ============================ [] = []
< search. Subgoal 1.14: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (appString E1 E2) VarsA : vars (appString E1 E2) V1 @ VarsB : vars (appString E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.14: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (appString E1 E2) V1 @ VarsB : vars (appString E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.14: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (appString E1 E2) V1 @ VarsB : vars (appString E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.14: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (appString E1 E2) V1 @ VarsB : vars (appString E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB2. Subgoal 1.14: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (appString E1 E2) V1 @ VarsB : vars (appString E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB3. Subgoal 1.14: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (appString E1 E2) V2 @ VarsB : vars (appString E1 E2) V2 VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB1 : vars E1 V5 VarsB2 : vars E2 V6 VarsB3 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.15: Variables: V2 X IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (name X) VarsA : vars (name X) [X] @ VarsB : vars (name X) V2 ============================ [X] = V2
< case VarsB. Subgoal 1.15: Variables: X IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (name X) VarsA : vars (name X) [X] @ ============================ [X] = [X]
< search. Subgoal 1.16: Variables: V1 V2 Args Fun IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (call Fun Args) VarsA : vars (call Fun Args) V1 @ VarsB : vars (call Fun Args) V2 VarsA1 : varsArgs Args V1 * ============================ V1 = V2
< case IsE. Subgoal 1.16: Variables: V1 V2 Args Fun IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (call Fun Args) V1 @ VarsB : vars (call Fun Args) V2 VarsA1 : varsArgs Args V1 * H1 : is_string Fun H2 : is_args Args ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.16: Variables: V1 V2 Args Fun IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (call Fun Args) V1 @ VarsB : vars (call Fun Args) V2 VarsA1 : varsArgs Args V1 * H1 : is_string Fun H2 : is_args Args VarsB1 : varsArgs Args V2 ============================ V1 = V2
< apply IH1 to _ VarsA1 VarsB1. Subgoal 1.16: Variables: V2 Args Fun IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (call Fun Args) V2 @ VarsB : vars (call Fun Args) V2 VarsA1 : varsArgs Args V2 * H1 : is_string Fun H2 : is_args Args VarsB1 : varsArgs Args V2 ============================ V2 = V2
< apply IH1 to _ VarsA1 VarsB1. Subgoal 1.16: Variables: V2 Args Fun IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (call Fun Args) V2 @ VarsB : vars (call Fun Args) V2 VarsA1 : varsArgs Args V2 * H1 : is_string Fun H2 : is_args Args VarsB1 : varsArgs Args V2 ============================ V2 = V2
< search. Subgoal 1.17: Variables: V1 V2 E1 S IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (stmtExpr S E1) VarsA : vars (stmtExpr S E1) V1 @ VarsB : vars (stmtExpr S E1) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.17: Variables: V1 V2 E1 S IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (stmtExpr S E1) V1 @ VarsB : vars (stmtExpr S E1) V2 VarsA1 : vars E1 V1 * H1 : is_stmt S H2 : is_expr E1 ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.17: Variables: V1 V2 E1 S IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (stmtExpr S E1) V1 @ VarsB : vars (stmtExpr S E1) V2 VarsA1 : vars E1 V1 * H1 : is_stmt S H2 : is_expr E1 VarsB1 : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.17: Variables: V2 E1 S IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (stmtExpr S E1) V2 @ VarsB : vars (stmtExpr S E1) V2 VarsA1 : vars E1 V2 * H1 : is_stmt S H2 : is_expr E1 VarsB1 : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.18: Variables: V1 V2 RF IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (recBuild RF) VarsA : vars (recBuild RF) V1 @ VarsB : vars (recBuild RF) V2 VarsA1 : varsRecFields RF V1 * ============================ V1 = V2
< case IsE. Subgoal 1.18: Variables: V1 V2 RF IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (recBuild RF) V1 @ VarsB : vars (recBuild RF) V2 VarsA1 : varsRecFields RF V1 * H1 : is_recFieldExprs RF ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.18: Variables: V1 V2 RF IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (recBuild RF) V1 @ VarsB : vars (recBuild RF) V2 VarsA1 : varsRecFields RF V1 * H1 : is_recFieldExprs RF VarsB1 : varsRecFields RF V2 ============================ V1 = V2
< apply IH2 to _ VarsA1 VarsB1. Subgoal 1.18: Variables: V2 RF IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (recBuild RF) V2 @ VarsB : vars (recBuild RF) V2 VarsA1 : varsRecFields RF V2 * H1 : is_recFieldExprs RF VarsB1 : varsRecFields RF V2 ============================ V2 = V2
< search. Subgoal 1.19: Variables: V1 V2 Field Rec IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (recFieldAccess Rec Field) VarsA : vars (recFieldAccess Rec Field) V1 @ VarsB : vars (recFieldAccess Rec Field) V2 VarsA1 : vars Rec V1 * ============================ V1 = V2
< case IsE. Subgoal 1.19: Variables: V1 V2 Field Rec IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (recFieldAccess Rec Field) V1 @ VarsB : vars (recFieldAccess Rec Field) V2 VarsA1 : vars Rec V1 * H1 : is_expr Rec H2 : is_string Field ============================ V1 = V2
< VarsB: case VarsB (keep). Subgoal 1.19: Variables: V1 V2 Field Rec IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (recFieldAccess Rec Field) V1 @ VarsB : vars (recFieldAccess Rec Field) V2 VarsA1 : vars Rec V1 * H1 : is_expr Rec H2 : is_string Field VarsB1 : vars Rec V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB1. Subgoal 1.19: Variables: V2 Field Rec IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (recFieldAccess Rec Field) V2 @ VarsB : vars (recFieldAccess Rec Field) V2 VarsA1 : vars Rec V2 * H1 : is_expr Rec H2 : is_string Field VarsB1 : vars Rec V2 ============================ V2 = V2
< search. Subgoal 1.20: Variables: V1 V2 Ty Msg IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (errorExpr Msg Ty) VarsA : vars (errorExpr Msg Ty) V1 @ VarsB : vars (errorExpr Msg Ty) V2 VarsA1 : vars Msg V1 * ============================ V1 = V2
< case IsE. Subgoal 1.20: Variables: V1 V2 Ty Msg IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (errorExpr Msg Ty) V1 @ VarsB : vars (errorExpr Msg Ty) V2 VarsA1 : vars Msg V1 * H1 : is_expr Msg H2 : is_typ Ty ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.20: Variables: V1 V2 Ty Msg IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (errorExpr Msg Ty) V1 @ VarsA1 : vars Msg V1 * H1 : is_expr Msg H2 : is_typ Ty VarsB : vars Msg V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.20: Variables: V2 Ty Msg IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (errorExpr Msg Ty) V2 @ VarsA1 : vars Msg V2 * H1 : is_expr Msg H2 : is_typ Ty VarsB : vars Msg V2 ============================ V2 = V2
< search. Subgoal 2: Variables: A V1 V2 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsA : is_args A VarsA : varsArgs A V1 @ VarsB : varsArgs A V2 ============================ V1 = V2
< VarsA: case VarsA. Subgoal 2.1: Variables: V2 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsA : is_args nilArgs VarsB : varsArgs nilArgs V2 ============================ [] = V2
< case VarsB. Subgoal 2.1: IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsA : is_args nilArgs ============================ [] = []
< search. Subgoal 2.2: Variables: V1 V2 VE VRest Rest E IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsA : is_args (consArgs E Rest) VarsB : varsArgs (consArgs E Rest) V2 VarsA : vars E VE * VarsA1 : varsArgs Rest VRest * VarsA2 : VE ++ VRest = V1 ============================ V1 = V2
< case IsA. Subgoal 2.2: Variables: V1 V2 VE VRest Rest E IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsB : varsArgs (consArgs E Rest) V2 VarsA : vars E VE * VarsA1 : varsArgs Rest VRest * VarsA2 : VE ++ VRest = V1 H1 : is_expr E H2 : is_args Rest ============================ V1 = V2
< VarsB: case VarsB. Subgoal 2.2: Variables: V1 V2 VE VRest Rest E VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE * VarsA1 : varsArgs Rest VRest * VarsA2 : VE ++ VRest = V1 H1 : is_expr E H2 : is_args Rest VarsB : vars E VE1 VarsB1 : varsArgs Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V1 = V2
< apply IH to _ VarsA VarsB. Subgoal 2.2: Variables: V1 V2 VRest Rest E VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE1 * VarsA1 : varsArgs Rest VRest * VarsA2 : VE1 ++ VRest = V1 H1 : is_expr E H2 : is_args Rest VarsB : vars E VE1 VarsB1 : varsArgs Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V1 = V2
< apply IH1 to _ VarsA1 VarsB1. Subgoal 2.2: Variables: V1 V2 Rest E VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE1 * VarsA1 : varsArgs Rest VRest1 * VarsA2 : VE1 ++ VRest1 = V1 H1 : is_expr E H2 : is_args Rest VarsB : vars E VE1 VarsB1 : varsArgs Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V1 = V2
< apply append_unique to VarsA2 VarsB2. Subgoal 2.2: Variables: V2 Rest E VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE1 * VarsA1 : varsArgs Rest VRest1 * VarsA2 : VE1 ++ VRest1 = V2 H1 : is_expr E H2 : is_args Rest VarsB : vars E VE1 VarsB1 : varsArgs Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V2 = V2
< search. Subgoal 3: Variables: RF V1 V2 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsRF : is_recFieldExprs RF VarsA : varsRecFields RF V1 @ VarsB : varsRecFields RF V2 ============================ V1 = V2
< VarsA: case VarsA. Subgoal 3.1: Variables: V2 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsRF : is_recFieldExprs nilRecFieldExprs VarsB : varsRecFields nilRecFieldExprs V2 ============================ [] = V2
< case VarsB. Subgoal 3.1: IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsRF : is_recFieldExprs nilRecFieldExprs ============================ [] = []
< search. Subgoal 3.2: Variables: V1 V2 VE VRest Rest E F IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) VarsB : varsRecFields (consRecFieldExprs F E Rest) V2 VarsA : vars E VE * VarsA1 : varsRecFields Rest VRest * VarsA2 : VE ++ VRest = V1 ============================ V1 = V2
< case IsRF. Subgoal 3.2: Variables: V1 V2 VE VRest Rest E F IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsB : varsRecFields (consRecFieldExprs F E Rest) V2 VarsA : vars E VE * VarsA1 : varsRecFields Rest VRest * VarsA2 : VE ++ VRest = V1 H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ V1 = V2
< VarsB: case VarsB. Subgoal 3.2: Variables: V1 V2 VE VRest Rest E F VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE * VarsA1 : varsRecFields Rest VRest * VarsA2 : VE ++ VRest = V1 H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest VarsB : vars E VE1 VarsB1 : varsRecFields Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V1 = V2
< apply IH to _ VarsA VarsB. Subgoal 3.2: Variables: V1 V2 VRest Rest E F VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE1 * VarsA1 : varsRecFields Rest VRest * VarsA2 : VE1 ++ VRest = V1 H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest VarsB : vars E VE1 VarsB1 : varsRecFields Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V1 = V2
< apply IH2 to _ VarsA1 VarsB1. Subgoal 3.2: Variables: V1 V2 Rest E F VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE1 * VarsA1 : varsRecFields Rest VRest1 * VarsA2 : VE1 ++ VRest1 = V1 H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest VarsB : vars E VE1 VarsB1 : varsRecFields Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V1 = V2
< apply append_unique to VarsA2 VarsB2. Subgoal 3.2: Variables: V2 Rest E F VE1 VRest1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars E VE1 * VarsA1 : varsRecFields Rest VRest1 * VarsA2 : VE1 ++ VRest1 = V2 H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest VarsB : vars E VE1 VarsB1 : varsRecFields Rest VRest1 VarsB2 : VE1 ++ VRest1 = V2 ============================ V2 = V2
< search. Proof completed.
< Theorem append_list_string_is : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 -> is_list is_string L3. ============================ forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 -> is_list is_string L3
< induction on 3. IH : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 * -> is_list is_string L3 ============================ forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 @ -> is_list is_string L3
< intros IsA IsB App. Variables: L1 L2 L3 IH : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 * -> is_list is_string L3 IsA : is_list is_string L1 IsB : is_list is_string L2 App : L1 ++ L2 = L3 @ ============================ is_list is_string L3
< App: case App. Subgoal 1: Variables: L3 IH : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 * -> is_list is_string L3 IsA : is_list is_string [] IsB : is_list is_string L3 ============================ is_list is_string L3
< search. Subgoal 2: Variables: L2 L5 H T IH : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 * -> is_list is_string L3 IsA : is_list is_string (H::T) IsB : is_list is_string L2 App : T ++ L2 = L5 * ============================ is_list is_string (H::L5)
< case IsA. Subgoal 2: Variables: L2 L5 H T IH : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 * -> is_list is_string L3 IsB : is_list is_string L2 App : T ++ L2 = L5 * H1 : is_string H H2 : is_list is_string T ============================ is_list is_string (H::L5)
< apply IH to _ _ App. Subgoal 2: Variables: L2 L5 H T IH : forall L1 L2 L3, is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L3 * -> is_list is_string L3 IsB : is_list is_string L2 App : T ++ L2 = L5 * H1 : is_string H H2 : is_list is_string T H3 : is_list is_string L5 ============================ is_list is_string (H::L5)
< search. Proof completed.
< Extensible_Theorem vars_is : forall E V, IsE : is_expr E -> V : vars E V -> is_list is_string V on Valso varsArgs_is : forall A V, IsA : is_args A -> V : varsArgs A V -> is_list is_string V on V, varsRecFields_is : forall RF V, IsRF : is_recFieldExprs RF -> V : varsRecFields RF V -> is_list is_string V on V. Subgoal 1.1: Variables: I IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (num I) V : vars (num I) [] @ ============================ is_list is_string []
< search. Subgoal 1.2: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (plus E1 E2) V : vars (plus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.2: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (plus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.2: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (plus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.2: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (plus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.2: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (plus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.3: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (minus E1 E2) V : vars (minus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.3: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (minus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.3: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (minus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.3: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (minus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.3: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (minus E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.4: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (mult E1 E2) V : vars (mult E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.4: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (mult E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.4: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (mult E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.4: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (mult E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.4: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (mult E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.5: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (div E1 E2) V : vars (div E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.5: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (div E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.5: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (div E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.5: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (div E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.5: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (div E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.6: IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr true V : vars true [] @ ============================ is_list is_string []
< search. Subgoal 1.7: IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr false V : vars false [] @ ============================ is_list is_string []
< search. Subgoal 1.8: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (and E1 E2) V : vars (and E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.8: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (and E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.8: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (and E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.8: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (and E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.8: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (and E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.9: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (or E1 E2) V : vars (or E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.9: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (or E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.9: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (or E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.9: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (or E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.9: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (or E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.10: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (not E1) V : vars (not E1) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.10: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (not E1) V @ V1 : vars E1 V * H1 : is_expr E1 ============================ is_list is_string V
< Is: apply IH to _ V1. Subgoal 1.10: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (not E1) V @ V1 : vars E1 V * H1 : is_expr E1 Is : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.11: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (greater E1 E2) V : vars (greater E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.11: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (greater E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.11: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (greater E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.11: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (greater E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.11: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (greater E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.12: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (eq E1 E2) V : vars (eq E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.12: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (eq E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.12: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (eq E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.12: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (eq E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.12: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (eq E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.13: Variables: S IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (stringLit S) V : vars (stringLit S) [] @ ============================ is_list is_string []
< search. Subgoal 1.14: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (appString E1 E2) V : vars (appString E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.14: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (appString E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< IsV2: apply IH to _ V1. Subgoal 1.14: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (appString E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 ============================ is_list is_string V
< IsV3: apply IH to _ V2. Subgoal 1.14: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (appString E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.14: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (appString E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 IsV2 : is_list is_string V2 IsV3 : is_list is_string V3 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.15: Variables: X IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (name X) V : vars (name X) [X] @ ============================ is_list is_string [X]
< case IsE. Subgoal 1.15: Variables: X IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (name X) [X] @ H1 : is_string X ============================ is_list is_string [X]
< search. Subgoal 1.16: Variables: V Args Fun IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (call Fun Args) V : vars (call Fun Args) V @ V1 : varsArgs Args V * ============================ is_list is_string V
< case IsE. Subgoal 1.16: Variables: V Args Fun IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (call Fun Args) V @ V1 : varsArgs Args V * H1 : is_string Fun H2 : is_args Args ============================ is_list is_string V
< apply IH1 to _ V1. Subgoal 1.16: Variables: V Args Fun IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (call Fun Args) V @ V1 : varsArgs Args V * H1 : is_string Fun H2 : is_args Args H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.17: Variables: V E1 S IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (stmtExpr S E1) V : vars (stmtExpr S E1) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.17: Variables: V E1 S IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (stmtExpr S E1) V @ V1 : vars E1 V * H1 : is_stmt S H2 : is_expr E1 ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.17: Variables: V E1 S IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (stmtExpr S E1) V @ V1 : vars E1 V * H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.18: Variables: V RF IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (recBuild RF) V : vars (recBuild RF) V @ V1 : varsRecFields RF V * ============================ is_list is_string V
< case IsE. Subgoal 1.18: Variables: V RF IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (recBuild RF) V @ V1 : varsRecFields RF V * H1 : is_recFieldExprs RF ============================ is_list is_string V
< apply IH2 to _ V1. Subgoal 1.18: Variables: V RF IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (recBuild RF) V @ V1 : varsRecFields RF V * H1 : is_recFieldExprs RF H2 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.19: Variables: V Field Rec IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (recFieldAccess Rec Field) V : vars (recFieldAccess Rec Field) V @ V1 : vars Rec V * ============================ is_list is_string V
< case IsE. Subgoal 1.19: Variables: V Field Rec IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (recFieldAccess Rec Field) V @ V1 : vars Rec V * H1 : is_expr Rec H2 : is_string Field ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.19: Variables: V Field Rec IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (recFieldAccess Rec Field) V @ V1 : vars Rec V * H1 : is_expr Rec H2 : is_string Field H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.20: Variables: V Ty Msg IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (errorExpr Msg Ty) V : vars (errorExpr Msg Ty) V @ V1 : vars Msg V * ============================ is_list is_string V
< case IsE. Subgoal 1.20: Variables: V Ty Msg IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (errorExpr Msg Ty) V @ V1 : vars Msg V * H1 : is_expr Msg H2 : is_typ Ty ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.20: Variables: V Ty Msg IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (errorExpr Msg Ty) V @ V1 : vars Msg V * H1 : is_expr Msg H2 : is_typ Ty H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 2: Variables: A V IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsA : is_args A V : varsArgs A V @ ============================ is_list is_string V
< V: case V. Subgoal 2.1: IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsA : is_args nilArgs ============================ is_list is_string []
< search. Subgoal 2.2: Variables: V VE VRest Rest E IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsA : is_args (consArgs E Rest) V : vars E VE * V1 : varsArgs Rest VRest * V2 : VE ++ VRest = V ============================ is_list is_string V
< case IsA. Subgoal 2.2: Variables: V VE VRest Rest E IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsArgs Rest VRest * V2 : VE ++ VRest = V H1 : is_expr E H2 : is_args Rest ============================ is_list is_string V
< Is1: apply IH to _ V. Subgoal 2.2: Variables: V VE VRest Rest E IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsArgs Rest VRest * V2 : VE ++ VRest = V H1 : is_expr E H2 : is_args Rest Is1 : is_list is_string VE ============================ is_list is_string V
< Is2: apply IH1 to _ V1. Subgoal 2.2: Variables: V VE VRest Rest E IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsArgs Rest VRest * V2 : VE ++ VRest = V H1 : is_expr E H2 : is_args Rest Is1 : is_list is_string VE Is2 : is_list is_string VRest ============================ is_list is_string V
< apply append_list_string_is to _ _ V2. Subgoal 2.2: Variables: V VE VRest Rest E IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsArgs Rest VRest * V2 : VE ++ VRest = V H1 : is_expr E H2 : is_args Rest Is1 : is_list is_string VE Is2 : is_list is_string VRest H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 3: Variables: RF V IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsRF : is_recFieldExprs RF V : varsRecFields RF V @ ============================ is_list is_string V
< V: case V. Subgoal 3.1: IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsRF : is_recFieldExprs nilRecFieldExprs ============================ is_list is_string []
< search. Subgoal 3.2: Variables: V VE VRest Rest E F IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) V : vars E VE * V1 : varsRecFields Rest VRest * V2 : VE ++ VRest = V ============================ is_list is_string V
< Is: case IsRF. Subgoal 3.2: Variables: V VE VRest Rest E F IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsRecFields Rest VRest * V2 : VE ++ VRest = V Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest ============================ is_list is_string V
< IsA: apply IH to _ V. Subgoal 3.2: Variables: V VE VRest Rest E F IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsRecFields Rest VRest * V2 : VE ++ VRest = V Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest IsA : is_list is_string VE ============================ is_list is_string V
< IsB: apply IH2 to _ V1. Subgoal 3.2: Variables: V VE VRest Rest E F IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsRecFields Rest VRest * V2 : VE ++ VRest = V Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest IsA : is_list is_string VE IsB : is_list is_string VRest ============================ is_list is_string V
< apply append_list_string_is to _ _ V2. Subgoal 3.2: Variables: V VE VRest Rest E F IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars E VE * V1 : varsRecFields Rest VRest * V2 : VE ++ VRest = V Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest IsA : is_list is_string VE IsB : is_list is_string VRest H1 : is_list is_string V ============================ is_list is_string V
< search. Proof completed.
< Theorem append_list_string_total : forall L1 L2, is_list is_string L1 -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3. ============================ forall L1 L2, is_list is_string L1 -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3
< induction on 1. IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3 ============================ forall L1 L2, is_list is_string L1 @ -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3
< intros IsA IsB. Variables: L1 L2 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3 IsA : is_list is_string L1 @ IsB : is_list is_string L2 ============================ exists L3, L1 ++ L2 = L3
< IsA: case IsA. Subgoal 1: Variables: L2 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3 IsB : is_list is_string L2 ============================ exists L3, [] ++ L2 = L3
< search. Subgoal 2: Variables: L2 T H IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3 IsB : is_list is_string L2 IsA : is_string H IsA1 : is_list is_string T * ============================ exists L3, H::T ++ L2 = L3
< apply IH to IsA1 IsB. Subgoal 2: Variables: L2 T H L3 IH : forall L1 L2, is_list is_string L1 * -> is_list is_string L2 -> exists L3, L1 ++ L2 = L3 IsB : is_list is_string L2 IsA : is_string H IsA1 : is_list is_string T * H1 : T ++ L2 = L3 ============================ exists L3, H::T ++ L2 = L3
< search. Proof completed.
< Extensible_Theorem vars_exist : forall E, IsE : is_expr E -> exists V, vars E V on IsE, varsArgs_exist : forall A, IsA : is_args A -> exists V, varsArgs A V on IsA, varsRecFields_exist : forall RF, IsRF : is_recFieldExprs RF -> exists V, varsRecFields RF V on IsRF. Subgoal 1.1: Variables: I IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (num I) @ IsE1 : is_integer I ============================ exists V, vars (num I) V
< search. Subgoal 1.2: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (plus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (plus Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.2: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (plus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (plus Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.2: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (plus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (plus Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.2: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (plus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (plus Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.2: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (plus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (plus Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.2: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (plus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (plus Expr1 Expr) V
< search. Subgoal 1.3: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (minus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (minus Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.3: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (minus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (minus Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.3: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (minus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (minus Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.3: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (minus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (minus Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.3: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (minus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (minus Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.3: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (minus Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (minus Expr1 Expr) V
< search. Subgoal 1.4: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (mult Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (mult Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.4: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (mult Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (mult Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.4: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (mult Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (mult Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.4: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (mult Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (mult Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.4: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (mult Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (mult Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.4: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (mult Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (mult Expr1 Expr) V
< search. Subgoal 1.5: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (div Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (div Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.5: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (div Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (div Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.5: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (div Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (div Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.5: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (div Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (div Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.5: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (div Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (div Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.5: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (div Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (div Expr1 Expr) V
< search. Subgoal 1.6: IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr true @ ============================ exists V, vars true V
< search. Subgoal 1.7: IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr false @ ============================ exists V, vars false V
< search. Subgoal 1.8: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (and Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (and Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.8: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (and Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (and Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.8: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (and Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (and Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.8: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (and Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (and Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.8: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (and Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (and Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.8: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (and Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (and Expr1 Expr) V
< search. Subgoal 1.9: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (or Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (or Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.9: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (or Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (or Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.9: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (or Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (or Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.9: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (or Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (or Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.9: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (or Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (or Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.9: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (or Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (or Expr1 Expr) V
< search. Subgoal 1.10: Variables: Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (not Expr) @ IsE1 : is_expr Expr * ============================ exists V, vars (not Expr) V
< apply IH to IsE1. Subgoal 1.10: Variables: Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (not Expr) @ IsE1 : is_expr Expr * H1 : vars Expr V ============================ exists V, vars (not Expr) V
< search. Subgoal 1.11: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (greater Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (greater Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.11: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (greater Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (greater Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.11: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (greater Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (greater Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.11: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (greater Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (greater Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.11: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (greater Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (greater Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.11: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (greater Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (greater Expr1 Expr) V
< search. Subgoal 1.12: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (eq Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (eq Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.12: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (eq Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (eq Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.12: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (eq Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (eq Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.12: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (eq Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (eq Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.12: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (eq Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (eq Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.12: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (eq Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (eq Expr1 Expr) V
< search. Subgoal 1.13: Variables: S IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (stringLit S) @ IsE1 : is_string S ============================ exists V, vars (stringLit S) V
< search. Subgoal 1.14: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (appString Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (appString Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.14: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (appString Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (appString Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.14: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (appString Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (appString Expr1 Expr) V
< Is1: apply vars_is to _ V1. Subgoal 1.14: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (appString Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V ============================ exists V, vars (appString Expr1 Expr) V
< Is2: apply vars_is to _ V2. Subgoal 1.14: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (appString Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (appString Expr1 Expr) V
< apply append_list_string_total to Is1 Is2. Subgoal 1.14: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (appString Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (appString Expr1 Expr) V
< search. Subgoal 1.15: Variables: S IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (name S) @ IsE1 : is_string S ============================ exists V, vars (name S) V
< search. Subgoal 1.16: Variables: Args S IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (call S Args) @ IsE1 : is_string S IsE2 : is_args Args * ============================ exists V, vars (call S Args) V
< apply IH1 to IsE2. Subgoal 1.16: Variables: Args S V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (call S Args) @ IsE1 : is_string S IsE2 : is_args Args * H1 : varsArgs Args V ============================ exists V, vars (call S Args) V
< search. Subgoal 1.17: Variables: Expr Stmt IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (stmtExpr Stmt Expr) @ IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * ============================ exists V, vars (stmtExpr Stmt Expr) V
< apply IH to IsE2. Subgoal 1.17: Variables: Expr Stmt V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (stmtExpr Stmt Expr) @ IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * H1 : vars Expr V ============================ exists V, vars (stmtExpr Stmt Expr) V
< search. Subgoal 1.18: Variables: RecFieldExprs IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (recBuild RecFieldExprs) @ IsE1 : is_recFieldExprs RecFieldExprs * ============================ exists V, vars (recBuild RecFieldExprs) V
< apply IH2 to IsE1. Subgoal 1.18: Variables: RecFieldExprs V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (recBuild RecFieldExprs) @ IsE1 : is_recFieldExprs RecFieldExprs * H1 : varsRecFields RecFieldExprs V ============================ exists V, vars (recBuild RecFieldExprs) V
< search. Subgoal 1.19: Variables: S Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (recFieldAccess Expr S) @ IsE1 : is_expr Expr * IsE2 : is_string S ============================ exists V, vars (recFieldAccess Expr S) V
< apply IH to IsE1. Subgoal 1.19: Variables: S Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (recFieldAccess Expr S) @ IsE1 : is_expr Expr * IsE2 : is_string S H1 : vars Expr V ============================ exists V, vars (recFieldAccess Expr S) V
< search. Subgoal 1.20: Variables: Typ Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (errorExpr Expr Typ) @ IsE1 : is_expr Expr * IsE2 : is_typ Typ ============================ exists V, vars (errorExpr Expr Typ) V
< apply IH to IsE1. Subgoal 1.20: Variables: Typ Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (errorExpr Expr Typ) @ IsE1 : is_expr Expr * IsE2 : is_typ Typ H1 : vars Expr V ============================ exists V, vars (errorExpr Expr Typ) V
< search. Subgoal 2.1: IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args nilArgs @ ============================ exists V, varsArgs nilArgs V
< search. Subgoal 2.2: Variables: Args Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args (consArgs Expr Args) @ IsA1 : is_expr Expr * IsA2 : is_args Args * ============================ exists V, varsArgs (consArgs Expr Args) V
< VE: apply IH to IsA1. Subgoal 2.2: Variables: Args Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args (consArgs Expr Args) @ IsA1 : is_expr Expr * IsA2 : is_args Args * VE : vars Expr V ============================ exists V, varsArgs (consArgs Expr Args) V
< VA: apply IH1 to IsA2. Subgoal 2.2: Variables: Args Expr V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args (consArgs Expr Args) @ IsA1 : is_expr Expr * IsA2 : is_args Args * VE : vars Expr V VA : varsArgs Args V1 ============================ exists V, varsArgs (consArgs Expr Args) V
< IsVE: apply vars_is to _ VE. Subgoal 2.2: Variables: Args Expr V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args (consArgs Expr Args) @ IsA1 : is_expr Expr * IsA2 : is_args Args * VE : vars Expr V VA : varsArgs Args V1 IsVE : is_list is_string V ============================ exists V, varsArgs (consArgs Expr Args) V
< IsVA: apply varsArgs_is to _ VA. Subgoal 2.2: Variables: Args Expr V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args (consArgs Expr Args) @ IsA1 : is_expr Expr * IsA2 : is_args Args * VE : vars Expr V VA : varsArgs Args V1 IsVE : is_list is_string V IsVA : is_list is_string V1 ============================ exists V, varsArgs (consArgs Expr Args) V
< apply append_list_string_total to IsVE IsVA. Subgoal 2.2: Variables: Args Expr V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsA : is_args (consArgs Expr Args) @ IsA1 : is_expr Expr * IsA2 : is_args Args * VE : vars Expr V VA : varsArgs Args V1 IsVE : is_list is_string V IsVA : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, varsArgs (consArgs Expr Args) V
< search. Subgoal 3.1: IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs nilRecFieldExprs @ ============================ exists V, varsRecFields nilRecFieldExprs V
< search. Subgoal 3.2: Variables: RecFieldExprs Expr S IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * ============================ exists V, varsRecFields (consRecFieldExprs S Expr RecFieldExprs) V
< VE: apply IH to IsRF2. Subgoal 3.2: Variables: RecFieldExprs Expr S V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * VE : vars Expr V ============================ exists V, varsRecFields (consRecFieldExprs S Expr RecFieldExprs) V
< VRF: apply IH2 to IsRF3. Subgoal 3.2: Variables: RecFieldExprs Expr S V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * VE : vars Expr V VRF : varsRecFields RecFieldExprs V1 ============================ exists V, varsRecFields (consRecFieldExprs S Expr RecFieldExprs) V
< IsVE: apply vars_is to _ VE. Subgoal 3.2: Variables: RecFieldExprs Expr S V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * VE : vars Expr V VRF : varsRecFields RecFieldExprs V1 IsVE : is_list is_string V ============================ exists V, varsRecFields (consRecFieldExprs S Expr RecFieldExprs) V
< IsVRF: apply varsRecFields_is to _ VRF. Subgoal 3.2: Variables: RecFieldExprs Expr S V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * VE : vars Expr V VRF : varsRecFields RecFieldExprs V1 IsVE : is_list is_string V IsVRF : is_list is_string V1 ============================ exists V, varsRecFields (consRecFieldExprs S Expr RecFieldExprs) V
< apply append_list_string_total to IsVE IsVRF. Subgoal 3.2: Variables: RecFieldExprs Expr S V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * VE : vars Expr V VRF : varsRecFields RecFieldExprs V1 IsVE : is_list is_string V IsVRF : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, varsRecFields (consRecFieldExprs S Expr RecFieldExprs) V
< search. Proof completed.
< Extensible_Theorem stmtNames_is : forall Ctx S N Ctx', IsS : is_stmt S -> IsCtx : is_list (is_list is_string) Ctx -> SN : stmtNames Ctx S N Ctx' -> is_list is_string N on SN as IH_S, stmtNames_isCtx : forall Ctx S N Ctx', IsS : is_stmt S -> IsCtx : is_list (is_list is_string) Ctx -> SN : stmtNames Ctx S N Ctx' -> is_list (is_list is_string) Ctx' on SN as IH_S_C, exprNames_is : forall Ctx E N, IsE : is_expr E -> IsCtx : is_list (is_list is_string) Ctx -> EN : exprNames Ctx E N -> is_list is_string N on EN as IH_Ealso argsNames_is : forall Ctx A N, IsA : is_args A -> IsCtx : is_list (is_list is_string) Ctx -> AN : argsNames Ctx A N -> is_list is_string N on AN as IH_A, recFieldNames_is : forall Ctx RF N, IsRF : is_recFieldExprs RF -> IsCtx : is_list (is_list is_string) Ctx -> RFN : recFieldNames Ctx RF N -> is_list is_string N on RFN as IH_RF. Subgoal 1.1: Variables: Ctx' IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt noop IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' noop [] Ctx' @ ============================ is_list is_string []
< search. Subgoal 1.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (seq S1 S2) IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsS. Subgoal 1.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 ============================ is_list is_string N
< apply IH_S to _ _ SN1. Subgoal 1.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_S_C to _ _ SN1. Subgoal 1.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_string N2 H4 : is_list (is_list is_string) Ctx3 ============================ is_list is_string N
< apply IH_S to _ _ SN2. Subgoal 1.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_string N2 H4 : is_list (is_list is_string) Ctx3 H5 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ SN3. Subgoal 1.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_string N2 H4 : is_list (is_list is_string) Ctx3 H5 : is_list is_string N3 H6 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.3: Variables: N Ctx1 Scope X E Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (declare Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (declare Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * ============================ is_list is_string N
< case IsS. Subgoal 1.3: Variables: N Ctx1 Scope X E Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (declare Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.3: Variables: N Ctx1 Scope X E Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (declare Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.4: Variables: N Ctx' E X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) N Ctx' @ SN1 : mems X Ctx' SN2 : exprNames Ctx' E N * ============================ is_list is_string N
< case IsS. Subgoal 1.4: Variables: N Ctx' E X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) N Ctx' @ SN1 : mems X Ctx' SN2 : exprNames Ctx' E N * H1 : is_string X H2 : is_expr E ============================ is_list is_string N
< apply IH_E to _ _ SN2. Subgoal 1.4: Variables: N Ctx' E X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) N Ctx' @ SN1 : mems X Ctx' SN2 : exprNames Ctx' E N * H1 : is_string X H2 : is_expr E H3 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.5: Variables: Ctx' N1 X E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) (X::N1) Ctx' @ SN1 : not_mems X Ctx' SN2 : exprNames Ctx' E N1 * ============================ is_list is_string (X::N1)
< case IsS. Subgoal 1.5: Variables: Ctx' N1 X E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) (X::N1) Ctx' @ SN1 : not_mems X Ctx' SN2 : exprNames Ctx' E N1 * H1 : is_string X H2 : is_expr E ============================ is_list is_string (X::N1)
< apply IH_E to _ _ SN2. Subgoal 1.5: Variables: Ctx' N1 X E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) (X::N1) Ctx' @ SN1 : not_mems X Ctx' SN2 : exprNames Ctx' E N1 * H1 : is_string X H2 : is_expr E H3 : is_list is_string N1 ============================ is_list is_string (X::N1)
< search. Subgoal 1.6: Variables: N Ctx' E Fields R IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) N Ctx' @ SN1 : mems R Ctx' SN2 : exprNames Ctx' E N * ============================ is_list is_string N
< case IsS. Subgoal 1.6: Variables: N Ctx' E Fields R IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) N Ctx' @ SN1 : mems R Ctx' SN2 : exprNames Ctx' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ is_list is_string N
< apply IH_E to _ _ SN2. Subgoal 1.6: Variables: N Ctx' E Fields R IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) N Ctx' @ SN1 : mems R Ctx' SN2 : exprNames Ctx' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E H4 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.7: Variables: Ctx' N1 R E Fields IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) (R::N1) Ctx' @ SN1 : not_mems R Ctx' SN2 : exprNames Ctx' E N1 * ============================ is_list is_string (R::N1)
< case IsS. Subgoal 1.7: Variables: Ctx' N1 R E Fields IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) (R::N1) Ctx' @ SN1 : not_mems R Ctx' SN2 : exprNames Ctx' E N1 * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ is_list is_string (R::N1)
< apply IH_E to _ _ SN2. Subgoal 1.7: Variables: Ctx' N1 R E Fields IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) (R::N1) Ctx' @ SN1 : not_mems R Ctx' SN2 : exprNames Ctx' E N1 * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E H4 : is_list is_string N1 ============================ is_list is_string (R::N1)
< search. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (ifThenElse C T F) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N ============================ is_list is_string N
< case IsS. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : is_list is_string CN ============================ is_list is_string N
< apply IH_S to _ _ SN2. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : is_list is_string CN H5 : is_list is_string TN ============================ is_list is_string N
< apply IH_S to _ _ SN3. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : is_list is_string CN H5 : is_list is_string TN H6 : is_list is_string FN ============================ is_list is_string N
< apply append_list_string_is to _ _ SN4. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : is_list is_string CN H5 : is_list is_string TN H6 : is_list is_string FN H7 : is_list is_string N2 ============================ is_list is_string N
< apply append_list_string_is to _ _ SN5. Subgoal 1.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : is_list is_string CN H5 : is_list is_string TN H6 : is_list is_string FN H7 : is_list is_string N2 H8 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.9: Variables: N Ctx' CN BN CtxB Body Cond IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (while Cond Body) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' @ SN1 : exprNames Ctx' Cond CN * SN2 : stmtNames ([]::Ctx') Body BN CtxB * SN3 : CN ++ BN = N ============================ is_list is_string N
< case IsS. Subgoal 1.9: Variables: N Ctx' CN BN CtxB Body Cond IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' @ SN1 : exprNames Ctx' Cond CN * SN2 : stmtNames ([]::Ctx') Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.9: Variables: N Ctx' CN BN CtxB Body Cond IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' @ SN1 : exprNames Ctx' Cond CN * SN2 : stmtNames ([]::Ctx') Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_string CN ============================ is_list is_string N
< apply IH_S to _ _ SN2. Subgoal 1.9: Variables: N Ctx' CN BN CtxB Body Cond IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' @ SN1 : exprNames Ctx' Cond CN * SN2 : stmtNames ([]::Ctx') Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_string CN H4 : is_list is_string BN ============================ is_list is_string N
< apply append_list_string_is to _ _ SN3. Subgoal 1.9: Variables: N Ctx' CN BN CtxB Body Cond IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' @ SN1 : exprNames Ctx' Cond CN * SN2 : stmtNames ([]::Ctx') Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_string CN H4 : is_list is_string BN H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.10: Variables: N Ctx' Ctx2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (scopeStmt S1) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (scopeStmt S1) N Ctx' @ SN1 : stmtNames ([]::Ctx') S1 N Ctx2 * ============================ is_list is_string N
< case IsS. Subgoal 1.10: Variables: N Ctx' Ctx2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (scopeStmt S1) N Ctx' @ SN1 : stmtNames ([]::Ctx') S1 N Ctx2 * H1 : is_stmt S1 ============================ is_list is_string N
< apply IH_S to _ _ SN1. Subgoal 1.10: Variables: N Ctx' Ctx2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (scopeStmt S1) N Ctx' @ SN1 : stmtNames ([]::Ctx') S1 N Ctx2 * H1 : is_stmt S1 H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.11: Variables: N Ctx' E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (printVal E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (printVal E) N Ctx' @ SN1 : exprNames Ctx' E N * ============================ is_list is_string N
< case IsS. Subgoal 1.11: Variables: N Ctx' E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (printVal E) N Ctx' @ SN1 : exprNames Ctx' E N * H1 : is_expr E ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.11: Variables: N Ctx' E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (printVal E) N Ctx' @ SN1 : exprNames Ctx' E N * H1 : is_expr E H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 2.1: Variables: Ctx' IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt noop IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' noop [] Ctx' @ ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (seq S1 S2) IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N ============================ is_list (is_list is_string) Ctx'
< case IsS. Subgoal 2.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 ============================ is_list (is_list is_string) Ctx'
< apply IH_S_C to _ _ SN1. Subgoal 2.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list is_string) Ctx3 ============================ is_list (is_list is_string) Ctx'
< apply IH_S_C to _ _ SN2. Subgoal 2.2: Variables: Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' @ SN1 : stmtNames Ctx S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list is_string) Ctx3 H4 : is_list (is_list is_string) Ctx' ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.3: Variables: N Ctx1 Scope X E Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (declare Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (declare Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * ============================ is_list (is_list is_string) ((X::Scope)::Ctx1)
< case IsS. Subgoal 2.3: Variables: N Ctx1 Scope X E Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (declare Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ is_list (is_list is_string) ((X::Scope)::Ctx1)
< case IsCtx. Subgoal 2.3: Variables: N Ctx1 Scope X E Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N SN : stmtNames (Scope::Ctx1) (declare Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_list is_string Scope H5 : is_list (is_list is_string) Ctx1 ============================ is_list (is_list is_string) ((X::Scope)::Ctx1)
< search. Subgoal 2.4: Variables: N Ctx' E X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) N Ctx' @ SN1 : mems X Ctx' SN2 : exprNames Ctx' E N * ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.5: Variables: Ctx' N1 X E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assign X E) (X::N1) Ctx' @ SN1 : not_mems X Ctx' SN2 : exprNames Ctx' E N1 * ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.6: Variables: N Ctx' E Fields R IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) N Ctx' @ SN1 : mems R Ctx' SN2 : exprNames Ctx' E N * ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.7: Variables: Ctx' N1 R E Fields IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (recUpdate R Fields E) (R::N1) Ctx' @ SN1 : not_mems R Ctx' SN2 : exprNames Ctx' E N1 * ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.8: Variables: N Ctx' CN TN CtxT FN CtxF N2 F T C IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (ifThenElse C T F) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (ifThenElse C T F) N Ctx' @ SN1 : exprNames Ctx' C CN * SN2 : stmtNames ([]::Ctx') T TN CtxT * SN3 : stmtNames ([]::Ctx') F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.9: Variables: N Ctx' CN BN CtxB Body Cond IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (while Cond Body) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' @ SN1 : exprNames Ctx' Cond CN * SN2 : stmtNames ([]::Ctx') Body BN CtxB * SN3 : CN ++ BN = N ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.10: Variables: N Ctx' Ctx2 S1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (scopeStmt S1) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (scopeStmt S1) N Ctx' @ SN1 : stmtNames ([]::Ctx') S1 N Ctx2 * ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.11: Variables: N Ctx' E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (printVal E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (printVal E) N Ctx' @ SN1 : exprNames Ctx' E N * ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 3.1: Variables: Ctx I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (num I) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (num I) [] @ ============================ is_list is_string []
< search. Subgoal 3.2: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (plus E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.2: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.2: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.2: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.2: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.3: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (minus E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.3: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.3: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.3: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.3: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.4: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (mult E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.4: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.4: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.4: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.4: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.5: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (div E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.5: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.5: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.5: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.5: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.6: Variables: Ctx IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr true IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx true [] @ ============================ is_list is_string []
< search. Subgoal 3.7: Variables: Ctx IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx false [] @ ============================ is_list is_string []
< search. Subgoal 3.8: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (and E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.8: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.8: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.8: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.8: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.9: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (or E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.9: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.9: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.9: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.9: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.10: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (not E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (not E1) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.10: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (not E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.10: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (not E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.11: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (greater E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.11: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.11: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.11: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.11: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.12: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (eq E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.12: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.12: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.12: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.12: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.13: Variables: Ctx S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (stringLit S) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stringLit S) [] @ ============================ is_list is_string []
< search. Subgoal 3.14: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (appString E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.14: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.14: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.14: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.14: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.15: Variables: Ctx X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (name X) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X) [] @ EN1 : mems X Ctx ============================ is_list is_string []
< search. Subgoal 3.16: Variables: Ctx X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (name X) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X) [X] @ EN1 : not_mems X Ctx ============================ is_list is_string [X]
< case IsE. Subgoal 3.16: Variables: Ctx X IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X) [X] @ EN1 : not_mems X Ctx H1 : is_string X ============================ is_list is_string [X]
< search. Subgoal 3.17: Variables: Ctx N Args F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (call F Args) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (call F Args) N @ EN1 : argsNames Ctx Args N * ============================ is_list is_string N
< case IsE. Subgoal 3.17: Variables: Ctx N Args F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (call F Args) N @ EN1 : argsNames Ctx Args N * H1 : is_string F H2 : is_args Args ============================ is_list is_string N
< apply IH_A to _ _ EN1. Subgoal 3.17: Variables: Ctx N Args F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (call F Args) N @ EN1 : argsNames Ctx Args N * H1 : is_string F H2 : is_args Args H3 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.18: Variables: Ctx N NS CtxS NE E1 S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (stmtExpr S E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N ============================ is_list is_string N
< case IsE. Subgoal 3.18: Variables: Ctx N NS CtxS NE E1 S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 ============================ is_list is_string N
< apply IH_S to _ _ EN1. Subgoal 3.18: Variables: Ctx N NS CtxS NE E1 S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_string NS ============================ is_list is_string N
< apply IH_S_C to _ _ EN1. Subgoal 3.18: Variables: Ctx N NS CtxS NE E1 S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_string NS H4 : is_list (is_list is_string) CtxS ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.18: Variables: Ctx N NS CtxS NE E1 S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_string NS H4 : is_list (is_list is_string) CtxS H5 : is_list is_string NE ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.18: Variables: Ctx N NS CtxS NE E1 S IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_string NS H4 : is_list (is_list is_string) CtxS H5 : is_list is_string NE H6 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.19: Variables: Ctx N RF IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (recBuild RF) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recBuild RF) N @ EN1 : recFieldNames Ctx RF N * ============================ is_list is_string N
< case IsE. Subgoal 3.19: Variables: Ctx N RF IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recBuild RF) N @ EN1 : recFieldNames Ctx RF N * H1 : is_recFieldExprs RF ============================ is_list is_string N
< apply IH_RF to _ _ EN1. Subgoal 3.19: Variables: Ctx N RF IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recBuild RF) N @ EN1 : recFieldNames Ctx RF N * H1 : is_recFieldExprs RF H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.20: Variables: Ctx N F E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (recFieldAccess E1 F) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recFieldAccess E1 F) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.20: Variables: Ctx N F E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recFieldAccess E1 F) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_string F ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.20: Variables: Ctx N F E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recFieldAccess E1 F) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_string F H3 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.21: Variables: Ctx N Ty E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (errorExpr E1 Ty) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (errorExpr E1 Ty) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.21: Variables: Ctx N Ty E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (errorExpr E1 Ty) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_typ Ty ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.21: Variables: Ctx N Ty E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (errorExpr E1 Ty) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_typ Ty H3 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 4: Variables: Ctx A N IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsA : is_args A IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx A N @ ============================ is_list is_string N
< AN: case AN (keep). Subgoal 4.1: Variables: Ctx IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsA : is_args nilArgs IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx nilArgs [] @ ============================ is_list is_string []
< search. Subgoal 4.2: Variables: Ctx N EN AN A1 E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsA : is_args (consArgs E A1) IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N ============================ is_list is_string N
< case IsA. Subgoal 4.2: Variables: Ctx N EN AN A1 E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 ============================ is_list is_string N
< apply IH_E to _ _ AN1. Subgoal 4.2: Variables: Ctx N EN AN A1 E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 H3 : is_list is_string EN ============================ is_list is_string N
< apply IH_A to _ _ AN2. Subgoal 4.2: Variables: Ctx N EN AN A1 E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 H3 : is_list is_string EN H4 : is_list is_string AN ============================ is_list is_string N
< apply append_list_string_is to _ _ AN3. Subgoal 4.2: Variables: Ctx N EN AN A1 E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 H3 : is_list is_string EN H4 : is_list is_string AN H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 5: Variables: Ctx RF N IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsRF : is_recFieldExprs RF IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx RF N @ ============================ is_list is_string N
< RFN: case RFN (keep). Subgoal 5.1: Variables: Ctx IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsRF : is_recFieldExprs nilRecFieldExprs IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx nilRecFieldExprs [] @ ============================ is_list is_string []
< search. Subgoal 5.2: Variables: Ctx N EN RN RF1 E F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N ============================ is_list is_string N
< case IsRF. Subgoal 5.2: Variables: Ctx N EN RN RF1 E F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ is_list is_string N
< apply IH_E to _ _ RFN1. Subgoal 5.2: Variables: Ctx N EN RN RF1 E F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : is_list is_string EN ============================ is_list is_string N
< apply IH_RF to _ _ RFN2. Subgoal 5.2: Variables: Ctx N EN RN RF1 E F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : is_list is_string EN H5 : is_list is_string RN ============================ is_list is_string N
< apply append_list_string_is to _ _ RFN3. Subgoal 5.2: Variables: Ctx N EN RN RF1 E F IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : is_list is_string EN H5 : is_list is_string RN H6 : is_list is_string N ============================ is_list is_string N
< search. Proof completed.
< Theorem not_mems [A] : forall LS (A : A), not_mems A LS -> mems A LS -> false. ============================ forall LS A, not_mems A LS -> mems A LS -> false
< induction on 1. IH : forall LS A, not_mems A LS * -> mems A LS -> false ============================ forall LS A, not_mems A LS @ -> mems A LS -> false
< intros NM M. Variables: LS A IH : forall LS A, not_mems A LS * -> mems A LS -> false NM : not_mems A LS @ M : mems A LS ============================ false
< NM: case NM. Subgoal 1: Variables: A IH : forall LS A, not_mems A LS * -> mems A LS -> false M : mems A [] ============================ false
< case M. Subgoal 2: Variables: A Rest S IH : forall LS A, not_mems A LS * -> mems A LS -> false M : mems A (S::Rest) NM : not_mem A S NM1 : not_mems A Rest * ============================ false
< M: case M. Subgoal 2.1: Variables: A Rest S IH : forall LS A, not_mems A LS * -> mems A LS -> false NM : not_mem A S NM1 : not_mems A Rest * M : mem A S ============================ false
< apply not_mem to NM M. Subgoal 2.2: Variables: A Rest S IH : forall LS A, not_mems A LS * -> mems A LS -> false NM : not_mem A S NM1 : not_mems A Rest * M : mems A Rest ============================ false
< apply IH to NM1 M. Proof completed.
< Extensible_Theorem stmtNames_unique : forall Ctx S NA CtxA NB CtxB, IsS : is_stmt S -> IsCtx : is_list (is_list is_string) Ctx -> SNA : stmtNames Ctx S NA CtxA -> SNB : stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB on SNA as IH_S, exprNames_unique : forall Ctx E NA NB, IsE : is_expr E -> IsCtx : is_list (is_list is_string) Ctx -> ENA : exprNames Ctx E NA -> ENB : exprNames Ctx E NB -> NA = NB on ENA as IH_Ealso argsNames_unique : forall Ctx A NA NB, IsA : is_args A -> IsCtx : is_list (is_list is_string) Ctx -> ANA : argsNames Ctx A NA -> ANB : argsNames Ctx A NB -> NA = NB on ANA as IH_A, recFieldNames_unique : forall Ctx RF NA NB, IsRF : is_recFieldExprs RF -> IsCtx : is_list (is_list is_string) Ctx -> RFNA : recFieldNames Ctx RF NA -> RFNB : recFieldNames Ctx RF NB -> NA = NB on RFNA as IH_RF. Subgoal 1.1: Variables: CtxA NB CtxB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt noop IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA noop [] CtxA @ SNB : stmtNames CtxA noop NB CtxB ============================ [] = NB /\ CtxA = CtxB
< case SNB. Subgoal 1.1: Variables: CtxB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt noop IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB noop [] CtxB @ ============================ [] = [] /\ CtxB = CtxB
< search. Subgoal 1.2: Variables: Ctx NA CtxA NB CtxB N1 Ctx3 N2 S2 S1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (seq S1 S2) IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxA @ SNB : stmtNames Ctx (seq S1 S2) NB CtxB SNA1 : stmtNames Ctx S1 N1 Ctx3 * SNA2 : stmtNames Ctx3 S2 N2 CtxA * SNA3 : N1 ++ N2 = NA ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.2: Variables: Ctx NA CtxA NB CtxB N1 Ctx3 N2 S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (seq S1 S2) IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxA @ SNA1 : stmtNames Ctx S1 N1 Ctx3 * SNA2 : stmtNames Ctx3 S2 N2 CtxA * SNA3 : N1 ++ N2 = NA SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.2: Variables: Ctx NA CtxA NB CtxB N1 Ctx3 N2 S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxA @ SNA1 : stmtNames Ctx S1 N1 Ctx3 * SNA2 : stmtNames Ctx3 S2 N2 CtxA * SNA3 : N1 ++ N2 = NA SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB H1 : is_stmt S1 H2 : is_stmt S2 ============================ NA = NB /\ CtxA = CtxB
< apply IH_S to _ _ SNA1 SNB. Subgoal 1.2: Variables: Ctx NA CtxA NB CtxB N2 S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxA @ SNA1 : stmtNames Ctx S1 N3 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA * SNA3 : N3 ++ N2 = NA SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB H1 : is_stmt S1 H2 : is_stmt S2 ============================ NA = NB /\ CtxA = CtxB
< apply stmtNames_isCtx to _ _ SNA1. Subgoal 1.2: Variables: Ctx NA CtxA NB CtxB N2 S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxA @ SNA1 : stmtNames Ctx S1 N3 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA * SNA3 : N3 ++ N2 = NA SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list is_string) Ctx1 ============================ NA = NB /\ CtxA = CtxB
< apply stmtNames_isCtx to _ _ SNB. Subgoal 1.2: Variables: Ctx NA CtxA NB CtxB N2 S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxA @ SNA1 : stmtNames Ctx S1 N3 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA * SNA3 : N3 ++ N2 = NA SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx1 ============================ NA = NB /\ CtxA = CtxB
< apply IH_S to _ _ SNA2 SNB1. Subgoal 1.2: Variables: Ctx NA NB CtxB S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NA CtxB @ SNA1 : stmtNames Ctx S1 N3 Ctx1 * SNA2 : stmtNames Ctx1 S2 N4 CtxB * SNA3 : N3 ++ N4 = NA SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx1 ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA3 SNB2. Subgoal 1.2: Variables: Ctx NB CtxB S2 S1 N3 Ctx1 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx SNA : stmtNames Ctx (seq S1 S2) NB CtxB @ SNA1 : stmtNames Ctx S1 N3 Ctx1 * SNA2 : stmtNames Ctx1 S2 N4 CtxB * SNA3 : N3 ++ N4 = NB SNB : stmtNames Ctx S1 N3 Ctx1 SNB1 : stmtNames Ctx1 S2 N4 CtxB SNB2 : N3 ++ N4 = NB H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx1 ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.3: Variables: NA NB CtxB Ctx1 Scope X E Ty IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (declare Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (declare Ty X E) NA ((X::Scope)::Ctx1) @ SNB : stmtNames (Scope::Ctx1) (declare Ty X E) NB CtxB SNA1 : exprNames (Scope::Ctx1) E NA * ============================ NA = NB /\ (X::Scope)::Ctx1 = CtxB
< case IsS. Subgoal 1.3: Variables: NA NB CtxB Ctx1 Scope X E Ty IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (declare Ty X E) NA ((X::Scope)::Ctx1) @ SNB : stmtNames (Scope::Ctx1) (declare Ty X E) NB CtxB SNA1 : exprNames (Scope::Ctx1) E NA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ NA = NB /\ (X::Scope)::Ctx1 = CtxB
< SNB: case SNB. Subgoal 1.3: Variables: NA NB Ctx1 Scope X E Ty IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (declare Ty X E) NA ((X::Scope)::Ctx1) @ SNA1 : exprNames (Scope::Ctx1) E NA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SNB : exprNames (Scope::Ctx1) E NB ============================ NA = NB /\ (X::Scope)::Ctx1 = (X::Scope)::Ctx1
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.3: Variables: NB Ctx1 Scope X E Ty IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (declare Ty X E) NB ((X::Scope)::Ctx1) @ SNA1 : exprNames (Scope::Ctx1) E NB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SNB : exprNames (Scope::Ctx1) E NB ============================ NB = NB /\ (X::Scope)::Ctx1 = (X::Scope)::Ctx1
< search. Subgoal 1.4: Variables: NA CtxA NB CtxB E X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (assign X E) NA CtxA @ SNB : stmtNames CtxA (assign X E) NB CtxB SNA1 : mems X CtxA SNA2 : exprNames CtxA E NA * ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.4: Variables: NA CtxA NB CtxB E X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (assign X E) NA CtxA @ SNB : stmtNames CtxA (assign X E) NB CtxB SNA1 : mems X CtxA SNA2 : exprNames CtxA E NA * H1 : is_string X H2 : is_expr E ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.4.1: Variables: NA NB CtxB E X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assign X E) NA CtxB @ SNA1 : mems X CtxB SNA2 : exprNames CtxB E NA * H1 : is_string X H2 : is_expr E SNB : mems X CtxB SNB1 : exprNames CtxB E NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.4.1: Variables: NB CtxB E X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assign X E) NB CtxB @ SNA1 : mems X CtxB SNA2 : exprNames CtxB E NB * H1 : is_string X H2 : is_expr E SNB : mems X CtxB SNB1 : exprNames CtxB E NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.4.2: Variables: NA CtxB E X N IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assign X E) NA CtxB @ SNA1 : mems X CtxB SNA2 : exprNames CtxB E NA * H1 : is_string X H2 : is_expr E SNB : not_mems X CtxB SNB1 : exprNames CtxB E N ============================ NA = X::N /\ CtxB = CtxB
< apply not_mems to SNB SNA1. Subgoal 1.5: Variables: CtxA NB CtxB N X E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (assign X E) (X::N) CtxA @ SNB : stmtNames CtxA (assign X E) NB CtxB SNA1 : not_mems X CtxA SNA2 : exprNames CtxA E N * ============================ X::N = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.5: Variables: CtxA NB CtxB N X E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (assign X E) (X::N) CtxA @ SNB : stmtNames CtxA (assign X E) NB CtxB SNA1 : not_mems X CtxA SNA2 : exprNames CtxA E N * H1 : is_string X H2 : is_expr E ============================ X::N = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.5.1: Variables: NB CtxB N X E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assign X E) (X::N) CtxB @ SNA1 : not_mems X CtxB SNA2 : exprNames CtxB E N * H1 : is_string X H2 : is_expr E SNB : mems X CtxB SNB1 : exprNames CtxB E NB ============================ X::N = NB /\ CtxB = CtxB
< apply not_mems to SNA1 SNB. Subgoal 1.5.2: Variables: CtxB N X E N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assign X E) (X::N) CtxB @ SNA1 : not_mems X CtxB SNA2 : exprNames CtxB E N * H1 : is_string X H2 : is_expr E SNB : not_mems X CtxB SNB1 : exprNames CtxB E N1 ============================ X::N = X::N1 /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.5.2: Variables: CtxB X E N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assign X E) (X::N1) CtxB @ SNA1 : not_mems X CtxB SNA2 : exprNames CtxB E N1 * H1 : is_string X H2 : is_expr E SNB : not_mems X CtxB SNB1 : exprNames CtxB E N1 ============================ X::N1 = X::N1 /\ CtxB = CtxB
< search. Subgoal 1.6: Variables: NA CtxA NB CtxB E Fields R IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (recUpdate R Fields E) NA CtxA @ SNB : stmtNames CtxA (recUpdate R Fields E) NB CtxB SNA1 : mems R CtxA SNA2 : exprNames CtxA E NA * ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.6: Variables: NA CtxA NB CtxB E Fields R IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (recUpdate R Fields E) NA CtxA @ SNB : stmtNames CtxA (recUpdate R Fields E) NB CtxB SNA1 : mems R CtxA SNA2 : exprNames CtxA E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.6.1: Variables: NA NB CtxB E Fields R IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (recUpdate R Fields E) NA CtxB @ SNA1 : mems R CtxB SNA2 : exprNames CtxB E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB SNB1 : exprNames CtxB E NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.6.1: Variables: NB CtxB E Fields R IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (recUpdate R Fields E) NB CtxB @ SNA1 : mems R CtxB SNA2 : exprNames CtxB E NB * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB SNB1 : exprNames CtxB E NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.6.2: Variables: NA CtxB E Fields R N IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (recUpdate R Fields E) NA CtxB @ SNA1 : mems R CtxB SNA2 : exprNames CtxB E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB SNB1 : exprNames CtxB E N ============================ NA = R::N /\ CtxB = CtxB
< apply not_mems to SNB SNA1. Subgoal 1.7: Variables: CtxA NB CtxB N R E Fields IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (recUpdate R Fields E) (R::N) CtxA @ SNB : stmtNames CtxA (recUpdate R Fields E) NB CtxB SNA1 : not_mems R CtxA SNA2 : exprNames CtxA E N * ============================ R::N = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.7: Variables: CtxA NB CtxB N R E Fields IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (recUpdate R Fields E) (R::N) CtxA @ SNB : stmtNames CtxA (recUpdate R Fields E) NB CtxB SNA1 : not_mems R CtxA SNA2 : exprNames CtxA E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ R::N = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.7.1: Variables: NB CtxB N R E Fields IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (recUpdate R Fields E) (R::N) CtxB @ SNA1 : not_mems R CtxB SNA2 : exprNames CtxB E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB SNB1 : exprNames CtxB E NB ============================ R::N = NB /\ CtxB = CtxB
< apply not_mems to SNA1 SNB. Subgoal 1.7.2: Variables: CtxB N R E Fields N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (recUpdate R Fields E) (R::N) CtxB @ SNA1 : not_mems R CtxB SNA2 : exprNames CtxB E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB SNB1 : exprNames CtxB E N1 ============================ R::N = R::N1 /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.7.2: Variables: CtxB R E Fields N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (recUpdate R Fields E) (R::N1) CtxB @ SNA1 : not_mems R CtxB SNA2 : exprNames CtxB E N1 * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB SNB1 : exprNames CtxB E N1 ============================ R::N1 = R::N1 /\ CtxB = CtxB
< search. Subgoal 1.8: Variables: NA CtxA NB CtxB CN TN CtxT FN CtxF N1 F T C IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (ifThenElse C T F) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (ifThenElse C T F) NA CtxA @ SNB : stmtNames CtxA (ifThenElse C T F) NB CtxB SNA1 : exprNames CtxA C CN * SNA2 : stmtNames ([]::CtxA) T TN CtxT * SNA3 : stmtNames ([]::CtxA) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.8: Variables: NA CtxA NB CtxB CN TN CtxT FN CtxF N1 F T C IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (ifThenElse C T F) NA CtxA @ SNB : stmtNames CtxA (ifThenElse C T F) NB CtxB SNA1 : exprNames CtxA C CN * SNA2 : stmtNames ([]::CtxA) T TN CtxT * SNA3 : stmtNames ([]::CtxA) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.8: Variables: NA NB CtxB CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (ifThenElse C T F) NA CtxB @ SNA1 : exprNames CtxB C CN * SNA2 : stmtNames ([]::CtxB) T TN CtxT * SNA3 : stmtNames ([]::CtxB) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames CtxB C CN1 SNB1 : stmtNames ([]::CtxB) T TN1 CtxT1 SNB2 : stmtNames ([]::CtxB) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.8: Variables: NA NB CtxB TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (ifThenElse C T F) NA CtxB @ SNA1 : exprNames CtxB C CN1 * SNA2 : stmtNames ([]::CtxB) T TN CtxT * SNA3 : stmtNames ([]::CtxB) F FN CtxF * SNA4 : CN1 ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames CtxB C CN1 SNB1 : stmtNames ([]::CtxB) T TN1 CtxT1 SNB2 : stmtNames ([]::CtxB) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_S to _ _ SNA2 SNB1. Subgoal 1.8: Variables: NA NB CtxB FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (ifThenElse C T F) NA CtxB @ SNA1 : exprNames CtxB C CN1 * SNA2 : stmtNames ([]::CtxB) T TN1 CtxT1 * SNA3 : stmtNames ([]::CtxB) F FN CtxF * SNA4 : CN1 ++ TN1 = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames CtxB C CN1 SNB1 : stmtNames ([]::CtxB) T TN1 CtxT1 SNB2 : stmtNames ([]::CtxB) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_S to _ _ SNA3 SNB2. Subgoal 1.8: Variables: NA NB CtxB N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (ifThenElse C T F) NA CtxB @ SNA1 : exprNames CtxB C CN1 * SNA2 : stmtNames ([]::CtxB) T TN1 CtxT1 * SNA3 : stmtNames ([]::CtxB) F FN1 CtxF1 * SNA4 : CN1 ++ TN1 = N1 SNA5 : N1 ++ FN1 = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames CtxB C CN1 SNB1 : stmtNames ([]::CtxB) T TN1 CtxT1 SNB2 : stmtNames ([]::CtxB) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA4 SNB3. Subgoal 1.8: Variables: NA NB CtxB F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (ifThenElse C T F) NA CtxB @ SNA1 : exprNames CtxB C CN1 * SNA2 : stmtNames ([]::CtxB) T TN1 CtxT1 * SNA3 : stmtNames ([]::CtxB) F FN1 CtxF1 * SNA4 : CN1 ++ TN1 = N2 SNA5 : N2 ++ FN1 = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames CtxB C CN1 SNB1 : stmtNames ([]::CtxB) T TN1 CtxT1 SNB2 : stmtNames ([]::CtxB) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA5 SNB4. Subgoal 1.8: Variables: NB CtxB F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (ifThenElse C T F) NB CtxB @ SNA1 : exprNames CtxB C CN1 * SNA2 : stmtNames ([]::CtxB) T TN1 CtxT1 * SNA3 : stmtNames ([]::CtxB) F FN1 CtxF1 * SNA4 : CN1 ++ TN1 = N2 SNA5 : N2 ++ FN1 = NB H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames CtxB C CN1 SNB1 : stmtNames ([]::CtxB) T TN1 CtxT1 SNB2 : stmtNames ([]::CtxB) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.9: Variables: NA CtxA NB CtxB CN BN CtxB1 Body Cond IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (while Cond Body) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (while Cond Body) NA CtxA @ SNB : stmtNames CtxA (while Cond Body) NB CtxB SNA1 : exprNames CtxA Cond CN * SNA2 : stmtNames ([]::CtxA) Body BN CtxB1 * SNA3 : CN ++ BN = NA ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.9: Variables: NA CtxA NB CtxB CN BN CtxB1 Body Cond IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (while Cond Body) NA CtxA @ SNB : stmtNames CtxA (while Cond Body) NB CtxB SNA1 : exprNames CtxA Cond CN * SNA2 : stmtNames ([]::CtxA) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.9: Variables: NA NB CtxB CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (while Cond Body) NA CtxB @ SNA1 : exprNames CtxB Cond CN * SNA2 : stmtNames ([]::CtxB) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames CtxB Cond CN1 SNB1 : stmtNames ([]::CtxB) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.9: Variables: NA NB CtxB BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (while Cond Body) NA CtxB @ SNA1 : exprNames CtxB Cond CN1 * SNA2 : stmtNames ([]::CtxB) Body BN CtxB1 * SNA3 : CN1 ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames CtxB Cond CN1 SNB1 : stmtNames ([]::CtxB) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_S to _ _ SNA2 SNB1. Subgoal 1.9: Variables: NA NB CtxB Body Cond CN1 BN1 CtxB2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (while Cond Body) NA CtxB @ SNA1 : exprNames CtxB Cond CN1 * SNA2 : stmtNames ([]::CtxB) Body BN1 CtxB2 * SNA3 : CN1 ++ BN1 = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames CtxB Cond CN1 SNB1 : stmtNames ([]::CtxB) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA3 SNB2. Subgoal 1.9: Variables: NB CtxB Body Cond CN1 BN1 CtxB2 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (while Cond Body) NB CtxB @ SNA1 : exprNames CtxB Cond CN1 * SNA2 : stmtNames ([]::CtxB) Body BN1 CtxB2 * SNA3 : CN1 ++ BN1 = NB H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames CtxB Cond CN1 SNB1 : stmtNames ([]::CtxB) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.10: Variables: NA CtxA NB CtxB Ctx2 S1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (scopeStmt S1) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (scopeStmt S1) NA CtxA @ SNB : stmtNames CtxA (scopeStmt S1) NB CtxB SNA1 : stmtNames ([]::CtxA) S1 NA Ctx2 * ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.10: Variables: NA CtxA NB CtxB Ctx2 S1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (scopeStmt S1) NA CtxA @ SNB : stmtNames CtxA (scopeStmt S1) NB CtxB SNA1 : stmtNames ([]::CtxA) S1 NA Ctx2 * H1 : is_stmt S1 ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.10: Variables: NA NB CtxB Ctx2 S1 Ctx1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (scopeStmt S1) NA CtxB @ SNA1 : stmtNames ([]::CtxB) S1 NA Ctx2 * H1 : is_stmt S1 SNB : stmtNames ([]::CtxB) S1 NB Ctx1 ============================ NA = NB /\ CtxB = CtxB
< apply IH_S to _ _ SNA1 SNB. Subgoal 1.10: Variables: NB CtxB S1 Ctx1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (scopeStmt S1) NB CtxB @ SNA1 : stmtNames ([]::CtxB) S1 NB Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::CtxB) S1 NB Ctx1 ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.11: Variables: NA CtxA NB CtxB E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (printVal E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (printVal E) NA CtxA @ SNB : stmtNames CtxA (printVal E) NB CtxB SNA1 : exprNames CtxA E NA * ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.11: Variables: NA CtxA NB CtxB E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (printVal E) NA CtxA @ SNB : stmtNames CtxA (printVal E) NB CtxB SNA1 : exprNames CtxA E NA * H1 : is_expr E ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.11: Variables: NA NB CtxB E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (printVal E) NA CtxB @ SNA1 : exprNames CtxB E NA * H1 : is_expr E SNB : exprNames CtxB E NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.11: Variables: NB CtxB E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (printVal E) NB CtxB @ SNA1 : exprNames CtxB E NB * H1 : is_expr E SNB : exprNames CtxB E NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 2.1: Variables: Ctx NB I IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (num I) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (num I) [] @ ENB : exprNames Ctx (num I) NB ============================ [] = NB
< case ENB. Subgoal 2.1: Variables: Ctx I IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (num I) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (num I) [] @ ============================ [] = []
< search. Subgoal 2.2: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (plus E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (plus E1 E2) NA @ ENB : exprNames Ctx (plus E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.2: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (plus E1 E2) NA @ ENB : exprNames Ctx (plus E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.2: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (plus E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.2: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (plus E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.2: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (plus E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.2: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (plus E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.3: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (minus E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (minus E1 E2) NA @ ENB : exprNames Ctx (minus E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.3: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (minus E1 E2) NA @ ENB : exprNames Ctx (minus E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.3: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (minus E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.3: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (minus E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.3: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (minus E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.3: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (minus E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.4: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (mult E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (mult E1 E2) NA @ ENB : exprNames Ctx (mult E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.4: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (mult E1 E2) NA @ ENB : exprNames Ctx (mult E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.4: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (mult E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.4: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (mult E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.4: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (mult E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.4: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (mult E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.5: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (div E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (div E1 E2) NA @ ENB : exprNames Ctx (div E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.5: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (div E1 E2) NA @ ENB : exprNames Ctx (div E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.5: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (div E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.5: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (div E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.5: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (div E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.5: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (div E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.6: Variables: Ctx NB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr true IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx true [] @ ENB : exprNames Ctx true NB ============================ [] = NB
< case ENB. Subgoal 2.6: Variables: Ctx IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr true IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx true [] @ ============================ [] = []
< search. Subgoal 2.7: Variables: Ctx NB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr false IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx false [] @ ENB : exprNames Ctx false NB ============================ [] = NB
< case ENB. Subgoal 2.7: Variables: Ctx IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr false IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx false [] @ ============================ [] = []
< search. Subgoal 2.8: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (and E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (and E1 E2) NA @ ENB : exprNames Ctx (and E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.8: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (and E1 E2) NA @ ENB : exprNames Ctx (and E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.8: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (and E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.8: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (and E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.8: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (and E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.8: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (and E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.9: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (or E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (or E1 E2) NA @ ENB : exprNames Ctx (or E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.9: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (or E1 E2) NA @ ENB : exprNames Ctx (or E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.9: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (or E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.9: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (or E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.9: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (or E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.9: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (or E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.10: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (not E1) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (not E1) NA @ ENB : exprNames Ctx (not E1) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.10: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (not E1) NA @ ENB : exprNames Ctx (not E1) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ============================ NA = NB
< ENB: case ENB. Subgoal 2.10: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (not E1) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.10: Variables: Ctx NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (not E1) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Subgoal 2.11: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (greater E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (greater E1 E2) NA @ ENB : exprNames Ctx (greater E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.11: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (greater E1 E2) NA @ ENB : exprNames Ctx (greater E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.11: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (greater E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.11: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (greater E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.11: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (greater E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.11: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (greater E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.12: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (eq E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (eq E1 E2) NA @ ENB : exprNames Ctx (eq E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.12: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (eq E1 E2) NA @ ENB : exprNames Ctx (eq E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.12: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (eq E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.12: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (eq E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.12: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (eq E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.12: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (eq E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.13: Variables: Ctx NB S IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (stringLit S) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stringLit S) [] @ ENB : exprNames Ctx (stringLit S) NB ============================ [] = NB
< case ENB. Subgoal 2.13: Variables: Ctx S IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (stringLit S) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stringLit S) [] @ ============================ [] = []
< search. Subgoal 2.14: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (appString E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (appString E1 E2) NA @ ENB : exprNames Ctx (appString E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.14: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (appString E1 E2) NA @ ENB : exprNames Ctx (appString E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.14: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (appString E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.14: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (appString E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.14: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (appString E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.14: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (appString E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.15: Variables: Ctx NB X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (name X) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [] @ ENB : exprNames Ctx (name X) NB ENA1 : mems X Ctx ============================ [] = NB
< case IsE. Subgoal 2.15: Variables: Ctx NB X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [] @ ENB : exprNames Ctx (name X) NB ENA1 : mems X Ctx H1 : is_string X ============================ [] = NB
< ENB: case ENB. Subgoal 2.15.1: Variables: Ctx X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [] @ ENA1 : mems X Ctx H1 : is_string X ENB : mems X Ctx ============================ [] = []
< search. Subgoal 2.15.2: Variables: Ctx X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [] @ ENA1 : mems X Ctx H1 : is_string X ENB : not_mems X Ctx ============================ [] = [X]
< apply not_mems to ENB ENA1. Subgoal 2.16: Variables: Ctx NB X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (name X) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [X] @ ENB : exprNames Ctx (name X) NB ENA1 : not_mems X Ctx ============================ [X] = NB
< case IsE. Subgoal 2.16: Variables: Ctx NB X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [X] @ ENB : exprNames Ctx (name X) NB ENA1 : not_mems X Ctx H1 : is_string X ============================ [X] = NB
< ENB: case ENB. Subgoal 2.16.1: Variables: Ctx X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [X] @ ENA1 : not_mems X Ctx H1 : is_string X ENB : mems X Ctx ============================ [X] = []
< apply not_mems to ENA1 ENB. Subgoal 2.16.2: Variables: Ctx X IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (name X) [X] @ ENA1 : not_mems X Ctx H1 : is_string X ENB : not_mems X Ctx ============================ [X] = [X]
< search. Subgoal 2.17: Variables: Ctx NA NB Args F IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (call F Args) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (call F Args) NA @ ENB : exprNames Ctx (call F Args) NB ENA1 : argsNames Ctx Args NA * ============================ NA = NB
< case IsE. Subgoal 2.17: Variables: Ctx NA NB Args F IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (call F Args) NA @ ENB : exprNames Ctx (call F Args) NB ENA1 : argsNames Ctx Args NA * H1 : is_string F H2 : is_args Args ============================ NA = NB
< ENB: case ENB. Subgoal 2.17: Variables: Ctx NA NB Args F IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (call F Args) NA @ ENA1 : argsNames Ctx Args NA * H1 : is_string F H2 : is_args Args ENB : argsNames Ctx Args NB ============================ NA = NB
< apply IH_A to _ _ ENA1 ENB. Subgoal 2.17: Variables: Ctx NB Args F IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (call F Args) NB @ ENA1 : argsNames Ctx Args NB * H1 : is_string F H2 : is_args Args ENB : argsNames Ctx Args NB ============================ NB = NB
< search. Subgoal 2.18: Variables: Ctx NA NB NS CtxS NE E1 S IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (stmtExpr S E1) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENB : exprNames Ctx (stmtExpr S E1) NB ENA1 : stmtNames ([]::Ctx) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA ============================ NA = NB
< case IsE. Subgoal 2.18: Variables: Ctx NA NB NS CtxS NE E1 S IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENB : exprNames Ctx (stmtExpr S E1) NB ENA1 : stmtNames ([]::Ctx) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ============================ NA = NB
< ENB: case ENB. Subgoal 2.18: Variables: Ctx NA NB NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENA1 : stmtNames ([]::Ctx) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::Ctx) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB ============================ NA = NB
< apply IH_S to _ _ ENA1 ENB. Subgoal 2.18: Variables: Ctx NA NB NE E1 S NS1 CtxS1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENA1 : stmtNames ([]::Ctx) S NS1 CtxS1 * ENA2 : exprNames CtxS1 E1 NE * ENA3 : NS1 ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::Ctx) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB ============================ NA = NB
< apply stmtNames_isCtx to _ _ ENA1. Subgoal 2.18: Variables: Ctx NA NB NE E1 S NS1 CtxS1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENA1 : stmtNames ([]::Ctx) S NS1 CtxS1 * ENA2 : exprNames CtxS1 E1 NE * ENA3 : NS1 ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::Ctx) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB H3 : is_list (is_list is_string) CtxS1 ============================ NA = NB
< apply stmtNames_isCtx to _ _ ENB. Subgoal 2.18: Variables: Ctx NA NB NE E1 S NS1 CtxS1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENA1 : stmtNames ([]::Ctx) S NS1 CtxS1 * ENA2 : exprNames CtxS1 E1 NE * ENA3 : NS1 ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::Ctx) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB H3 : is_list (is_list is_string) CtxS1 H4 : is_list (is_list is_string) CtxS1 ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.18: Variables: Ctx NA NB E1 S NS1 CtxS1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NA @ ENA1 : stmtNames ([]::Ctx) S NS1 CtxS1 * ENA2 : exprNames CtxS1 E1 NE1 * ENA3 : NS1 ++ NE1 = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::Ctx) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB H3 : is_list (is_list is_string) CtxS1 H4 : is_list (is_list is_string) CtxS1 ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.18: Variables: Ctx NB E1 S NS1 CtxS1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (stmtExpr S E1) NB @ ENA1 : stmtNames ([]::Ctx) S NS1 CtxS1 * ENA2 : exprNames CtxS1 E1 NE1 * ENA3 : NS1 ++ NE1 = NB H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::Ctx) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB H3 : is_list (is_list is_string) CtxS1 H4 : is_list (is_list is_string) CtxS1 ============================ NB = NB
< search. Subgoal 2.19: Variables: Ctx NA NB RF IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (recBuild RF) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recBuild RF) NA @ ENB : exprNames Ctx (recBuild RF) NB ENA1 : recFieldNames Ctx RF NA * ============================ NA = NB
< case IsE. Subgoal 2.19: Variables: Ctx NA NB RF IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recBuild RF) NA @ ENB : exprNames Ctx (recBuild RF) NB ENA1 : recFieldNames Ctx RF NA * H1 : is_recFieldExprs RF ============================ NA = NB
< ENB: case ENB. Subgoal 2.19: Variables: Ctx NA NB RF IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recBuild RF) NA @ ENA1 : recFieldNames Ctx RF NA * H1 : is_recFieldExprs RF ENB : recFieldNames Ctx RF NB ============================ NA = NB
< apply IH_RF to _ _ ENA1 ENB. Subgoal 2.19: Variables: Ctx NB RF IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recBuild RF) NB @ ENA1 : recFieldNames Ctx RF NB * H1 : is_recFieldExprs RF ENB : recFieldNames Ctx RF NB ============================ NB = NB
< search. Subgoal 2.20: Variables: Ctx NA NB F E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (recFieldAccess E1 F) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recFieldAccess E1 F) NA @ ENB : exprNames Ctx (recFieldAccess E1 F) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.20: Variables: Ctx NA NB F E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recFieldAccess E1 F) NA @ ENB : exprNames Ctx (recFieldAccess E1 F) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 H2 : is_string F ============================ NA = NB
< ENB: case ENB. Subgoal 2.20: Variables: Ctx NA NB F E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recFieldAccess E1 F) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 H2 : is_string F ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.20: Variables: Ctx NB F E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (recFieldAccess E1 F) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 H2 : is_string F ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Subgoal 2.21: Variables: Ctx NA NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (errorExpr E1 Ty) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (errorExpr E1 Ty) NA @ ENB : exprNames Ctx (errorExpr E1 Ty) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.21: Variables: Ctx NA NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (errorExpr E1 Ty) NA @ ENB : exprNames Ctx (errorExpr E1 Ty) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 H2 : is_typ Ty ============================ NA = NB
< ENB: case ENB. Subgoal 2.21: Variables: Ctx NA NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (errorExpr E1 Ty) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.21: Variables: Ctx NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (errorExpr E1 Ty) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Subgoal 3: Variables: Ctx A NA NB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsA : is_args A IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx A NA @ ANB : argsNames Ctx A NB ============================ NA = NB
< ANA: case ANA (keep). Subgoal 3.1: Variables: Ctx NB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsA : is_args nilArgs IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx nilArgs [] @ ANB : argsNames Ctx nilArgs NB ============================ [] = NB
< case ANB. Subgoal 3.1: Variables: Ctx IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsA : is_args nilArgs IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx nilArgs [] @ ============================ [] = []
< search. Subgoal 3.2: Variables: Ctx NA NB EN AN A1 E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsA : is_args (consArgs E A1) IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx (consArgs E A1) NA @ ANB : argsNames Ctx (consArgs E A1) NB ANA1 : exprNames Ctx E EN * ANA2 : argsNames Ctx A1 AN * ANA3 : EN ++ AN = NA ============================ NA = NB
< case IsA. Subgoal 3.2: Variables: Ctx NA NB EN AN A1 E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx (consArgs E A1) NA @ ANB : argsNames Ctx (consArgs E A1) NB ANA1 : exprNames Ctx E EN * ANA2 : argsNames Ctx A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ============================ NA = NB
< ANB: case ANB. Subgoal 3.2: Variables: Ctx NA NB EN AN A1 E EN1 AN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx (consArgs E A1) NA @ ANA1 : exprNames Ctx E EN * ANA2 : argsNames Ctx A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames Ctx E EN1 ANB1 : argsNames Ctx A1 AN1 ANB2 : EN1 ++ AN1 = NB ============================ NA = NB
< apply IH_E to _ _ ANA1 ANB. Subgoal 3.2: Variables: Ctx NA NB AN A1 E EN1 AN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx (consArgs E A1) NA @ ANA1 : exprNames Ctx E EN1 * ANA2 : argsNames Ctx A1 AN * ANA3 : EN1 ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames Ctx E EN1 ANB1 : argsNames Ctx A1 AN1 ANB2 : EN1 ++ AN1 = NB ============================ NA = NB
< apply IH_A to _ _ ANA2 ANB1. Subgoal 3.2: Variables: Ctx NA NB A1 E EN1 AN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx (consArgs E A1) NA @ ANA1 : exprNames Ctx E EN1 * ANA2 : argsNames Ctx A1 AN1 * ANA3 : EN1 ++ AN1 = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames Ctx E EN1 ANB1 : argsNames Ctx A1 AN1 ANB2 : EN1 ++ AN1 = NB ============================ NA = NB
< apply append_unique to ANA3 ANB2. Subgoal 3.2: Variables: Ctx NB A1 E EN1 AN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ANA : argsNames Ctx (consArgs E A1) NB @ ANA1 : exprNames Ctx E EN1 * ANA2 : argsNames Ctx A1 AN1 * ANA3 : EN1 ++ AN1 = NB H1 : is_expr E H2 : is_args A1 ANB : exprNames Ctx E EN1 ANB1 : argsNames Ctx A1 AN1 ANB2 : EN1 ++ AN1 = NB ============================ NB = NB
< search. Subgoal 4: Variables: Ctx RF NA NB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsRF : is_recFieldExprs RF IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx RF NA @ RFNB : recFieldNames Ctx RF NB ============================ NA = NB
< RFNA: case RFNA (keep). Subgoal 4.1: Variables: Ctx NB IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsRF : is_recFieldExprs nilRecFieldExprs IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx nilRecFieldExprs [] @ RFNB : recFieldNames Ctx nilRecFieldExprs NB ============================ [] = NB
< case RFNB. Subgoal 4.1: Variables: Ctx IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsRF : is_recFieldExprs nilRecFieldExprs IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx nilRecFieldExprs [] @ ============================ [] = []
< search. Subgoal 4.2: Variables: Ctx NA NB EN RN RF1 E F IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx (consRecFieldExprs F E RF1) NA @ RFNB : recFieldNames Ctx (consRecFieldExprs F E RF1) NB RFNA1 : exprNames Ctx E EN * RFNA2 : recFieldNames Ctx RF1 RN * RFNA3 : EN ++ RN = NA ============================ NA = NB
< case IsRF. Subgoal 4.2: Variables: Ctx NA NB EN RN RF1 E F IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx (consRecFieldExprs F E RF1) NA @ RFNB : recFieldNames Ctx (consRecFieldExprs F E RF1) NB RFNA1 : exprNames Ctx E EN * RFNA2 : recFieldNames Ctx RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ NA = NB
< RFNB: case RFNB. Subgoal 4.2: Variables: Ctx NA NB EN RN RF1 E F EN1 RN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx (consRecFieldExprs F E RF1) NA @ RFNA1 : exprNames Ctx E EN * RFNA2 : recFieldNames Ctx RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames Ctx E EN1 RFNB1 : recFieldNames Ctx RF1 RN1 RFNB2 : EN1 ++ RN1 = NB ============================ NA = NB
< apply IH_E to _ _ RFNA1 RFNB. Subgoal 4.2: Variables: Ctx NA NB RN RF1 E F EN1 RN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx (consRecFieldExprs F E RF1) NA @ RFNA1 : exprNames Ctx E EN1 * RFNA2 : recFieldNames Ctx RF1 RN * RFNA3 : EN1 ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames Ctx E EN1 RFNB1 : recFieldNames Ctx RF1 RN1 RFNB2 : EN1 ++ RN1 = NB ============================ NA = NB
< apply IH_RF to _ _ RFNA2 RFNB1. Subgoal 4.2: Variables: Ctx NA NB RF1 E F EN1 RN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx (consRecFieldExprs F E RF1) NA @ RFNA1 : exprNames Ctx E EN1 * RFNA2 : recFieldNames Ctx RF1 RN1 * RFNA3 : EN1 ++ RN1 = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames Ctx E EN1 RFNB1 : recFieldNames Ctx RF1 RN1 RFNB2 : EN1 ++ RN1 = NB ============================ NA = NB
< apply append_unique to RFNA3 RFNB2. Subgoal 4.2: Variables: Ctx NB RF1 E F EN1 RN1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx RFNA : recFieldNames Ctx (consRecFieldExprs F E RF1) NB @ RFNA1 : exprNames Ctx E EN1 * RFNA2 : recFieldNames Ctx RF1 RN1 * RFNA3 : EN1 ++ RN1 = NB H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames Ctx E EN1 RFNB1 : recFieldNames Ctx RF1 RN1 RFNB2 : EN1 ++ RN1 = NB ============================ NB = NB
< search. Proof completed.
< Extensible_Theorem stmtNames_keep_older : forall Scope Ctx S N Ctx', IsS : is_stmt S -> IsCtx : is_list (is_list is_string) (Scope::Ctx) -> SN : stmtNames (Scope::Ctx) S N Ctx' -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') on SN. Subgoal 1: Variables: Scope Ctx IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt noop IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) noop [] (Scope::Ctx) @ ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 2: Variables: Scope Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (seq S1 S2) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ SN1 : stmtNames (Scope::Ctx) S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N ============================ exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< case IsS. Subgoal 2: Variables: Scope Ctx N Ctx' N2 Ctx3 N3 S2 S1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ SN1 : stmtNames (Scope::Ctx) S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< apply IH to _ _ SN1. Subgoal 2: Variables: Scope Ctx N Ctx' N2 N3 S2 S1 Scope' IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' ============================ exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< apply stmtNames_isCtx to _ _ SN1. Subgoal 2: Variables: Scope Ctx N Ctx' N2 N3 S2 S1 Scope' IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) ============================ exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< apply IH to _ _ SN2. Subgoal 2: Variables: Scope Ctx N N2 N3 S2 S1 Scope' Scope'1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) H5 : forall X, mem X Scope' -> mem X Scope'1 ============================ exists Scope', Scope'1::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< exists Scope'1. Subgoal 2: Variables: Scope Ctx N N2 N3 S2 S1 Scope' Scope'1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) H5 : forall X, mem X Scope' -> mem X Scope'1 ============================ Scope'1::Ctx = Scope'1::Ctx /\ (forall X, mem X Scope -> mem X Scope'1)
< split. Subgoal 2.1: Variables: Scope Ctx N N2 N3 S2 S1 Scope' Scope'1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) H5 : forall X, mem X Scope' -> mem X Scope'1 ============================ Scope'1::Ctx = Scope'1::Ctx
< search. Subgoal 2.2: Variables: Scope Ctx N N2 N3 S2 S1 Scope' Scope'1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) H5 : forall X, mem X Scope' -> mem X Scope'1 ============================ forall X, mem X Scope -> mem X Scope'1
< intros M. Subgoal 2.2: Variables: Scope Ctx N N2 N3 S2 S1 Scope' Scope'1 X IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) H5 : forall X, mem X Scope' -> mem X Scope'1 M : mem X Scope ============================ mem X Scope'1
< backchain H5. Subgoal 2.2: Variables: Scope Ctx N N2 N3 S2 S1 Scope' Scope'1 X IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 H3 : forall X, mem X Scope -> mem X Scope' H4 : is_list (is_list is_string) (Scope'::Ctx) H5 : forall X, mem X Scope' -> mem X Scope'1 M : mem X Scope ============================ mem X Scope'
< backchain H3. Subgoal 3: Variables: Scope Ctx N X E Ty IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (declare Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (declare Ty X E) N ((X::Scope)::Ctx) @ SN1 : exprNames (Scope::Ctx) E N * ============================ exists Scope', (X::Scope)::Ctx = Scope'::Ctx /\ (forall X1, mem X1 Scope -> mem X1 Scope')
< search. Subgoal 4: Variables: Scope Ctx N E X IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X E) N (Scope::Ctx) @ SN1 : mems X (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N * ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 5: Variables: Scope Ctx N1 X E IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (assign X E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X E) (X::N1) (Scope::Ctx) @ SN1 : not_mems X (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 6: Variables: Scope Ctx N E Fields R IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) N (Scope::Ctx) @ SN1 : mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N * ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 7: Variables: Scope Ctx N1 R E Fields IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) (R::N1) (Scope::Ctx) @ SN1 : not_mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 8: Variables: Scope Ctx N CN TN CtxT FN CtxF N2 F T C IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (ifThenElse C T F) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 9: Variables: Scope Ctx N CN BN CtxB Body Cond IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (while Cond Body) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (while Cond Body) N (Scope::Ctx) @ SN1 : exprNames (Scope::Ctx) Cond CN * SN2 : stmtNames ([]::(Scope::Ctx)) Body BN CtxB * SN3 : CN ++ BN = N ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 10: Variables: Scope Ctx N Ctx2 S1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (scopeStmt S1) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (scopeStmt S1) N (Scope::Ctx) @ SN1 : stmtNames ([]::(Scope::Ctx)) S1 N Ctx2 * ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< case IsS. Subgoal 10: Variables: Scope Ctx N Ctx2 S1 IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (scopeStmt S1) N (Scope::Ctx) @ SN1 : stmtNames ([]::(Scope::Ctx)) S1 N Ctx2 * H1 : is_stmt S1 ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< apply IH to _ _ SN1. Subgoal 10: Variables: Scope Ctx N S1 Scope' IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (scopeStmt S1) N (Scope::Ctx) @ SN1 : stmtNames ([]::(Scope::Ctx)) S1 N (Scope'::(Scope::Ctx)) * H1 : is_stmt S1 H2 : forall X, mem X [] -> mem X Scope' ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 11: Variables: Scope Ctx N E IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (printVal E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (printVal E) N (Scope::Ctx) @ SN1 : exprNames (Scope::Ctx) E N * ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Proof completed.
< Theorem mems_or_not_mems : forall LS X, is_list (is_list is_string) LS -> is_string X -> mems X LS \/ not_mems X LS. ============================ forall LS X, is_list (is_list is_string) LS -> is_string X -> mems X LS \/ not_mems X LS
< induction on 1. IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS ============================ forall LS X, is_list (is_list is_string) LS @ -> is_string X -> mems X LS \/ not_mems X LS
< intros IsL IsX. Variables: LS X IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsL : is_list (is_list is_string) LS @ IsX : is_string X ============================ mems X LS \/ not_mems X LS
< IsL: case IsL. Subgoal 1: Variables: X IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X ============================ mems X [] \/ not_mems X []
< search. Subgoal 2: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * ============================ mems X (H::T) \/ not_mems X (H::T)
< Or: apply mem_string_list_or_not to IsX IsL. Subgoal 2: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * Or : mem X H \/ (mem X H -> false) ============================ mems X (H::T) \/ not_mems X (H::T)
< M: case Or. Subgoal 2.1: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * M : mem X H ============================ mems X (H::T) \/ not_mems X (H::T)
< search. Subgoal 2.2: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * M : mem X H -> false ============================ mems X (H::T) \/ not_mems X (H::T)
< Or: apply IH to IsL1 IsX. Subgoal 2.2: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * M : mem X H -> false Or : mems X T \/ not_mems X T ============================ mems X (H::T) \/ not_mems X (H::T)
< case Or. Subgoal 2.2.1: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * M : mem X H -> false H1 : mems X T ============================ mems X (H::T) \/ not_mems X (H::T)
< search. Subgoal 2.2.2: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * M : mem X H -> false H1 : not_mems X T ============================ mems X (H::T) \/ not_mems X (H::T)
< apply not_mem_not_mem to _ M. Subgoal 2.2.2: Variables: X T H IH : forall LS X, is_list (is_list is_string) LS * -> is_string X -> mems X LS \/ not_mems X LS IsX : is_string X IsL : is_list is_string H * IsL1 : is_list (is_list is_string) T * M : mem X H -> false H1 : not_mems X T H2 : not_mem X H ============================ mems X (H::T) \/ not_mems X (H::T)
< search. Proof completed.
< Extensible_Theorem stmtNames_exists : forall Scope Ctx S, IsS : is_stmt S -> IsCtx : is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' on IsS as IH_S, exprNames_exists : forall Ctx E, IsE : is_expr E -> IsCtx : is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N on IsE as IH_E, argsNames_exists : forall Ctx A, IsA : is_args A -> IsCtx : is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N on IsA as IH_A, recFieldNames_exists : forall Ctx RF, IsRF : is_recFieldExprs RF -> IsCtx : is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N on IsRF as IH_RF. Subgoal 1.1: Variables: Scope Ctx IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt noop @ IsCtx : is_list (is_list is_string) (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) noop N Ctx'
< search. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< SN1: apply IH_S to IsS1 _. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N Ctx' ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< IsC': apply stmtNames_isCtx to _ _ SN1. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N Ctx' IsC' : is_list (is_list is_string) Ctx' ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< IsN: apply stmtNames_is to _ _ SN1. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N Ctx' IsC' : is_list (is_list is_string) Ctx' IsN : is_list is_string N ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< apply stmtNames_keep_older to _ _ SN1. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Scope' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N (Scope'::Ctx) IsC' : is_list (is_list is_string) (Scope'::Ctx) IsN : is_list is_string N H1 : forall X, mem X Scope -> mem X Scope' ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< SN2: apply IH_S to IsS2 IsC'. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Scope' N1 Ctx'1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N (Scope'::Ctx) IsC' : is_list (is_list is_string) (Scope'::Ctx) IsN : is_list is_string N H1 : forall X, mem X Scope -> mem X Scope' SN2 : stmtNames (Scope'::Ctx) Stmt N1 Ctx'1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< IsN1: apply stmtNames_is to _ _ SN2. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Scope' N1 Ctx'1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N (Scope'::Ctx) IsC' : is_list (is_list is_string) (Scope'::Ctx) IsN : is_list is_string N H1 : forall X, mem X Scope -> mem X Scope' SN2 : stmtNames (Scope'::Ctx) Stmt N1 Ctx'1 IsN1 : is_list is_string N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< apply append_list_string_total to IsN IsN1. Subgoal 1.2: Variables: Scope Ctx Stmt Stmt1 N Scope' N1 Ctx'1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (seq Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt1 * IsS2 : is_stmt Stmt * SN1 : stmtNames (Scope::Ctx) Stmt1 N (Scope'::Ctx) IsC' : is_list (is_list is_string) (Scope'::Ctx) IsN : is_list is_string N H1 : forall X, mem X Scope -> mem X Scope' SN2 : stmtNames (Scope'::Ctx) Stmt N1 Ctx'1 IsN1 : is_list is_string N1 H2 : N ++ N1 = L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (seq Stmt1 Stmt) N Ctx'
< search. Subgoal 1.3: Variables: Scope Ctx Expr S1 Typ IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (declare Typ S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_typ Typ IsS2 : is_string S1 IsS3 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (declare Typ S1 Expr) N Ctx'
< apply IH_E to IsS3 _. Subgoal 1.3: Variables: Scope Ctx Expr S1 Typ N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (declare Typ S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_typ Typ IsS2 : is_string S1 IsS3 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (declare Typ S1 Expr) N Ctx'
< search. Subgoal 1.4: Variables: Scope Ctx Expr S1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assign S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (assign S1 Expr) N Ctx'
< apply IH_E to IsS2 _. Subgoal 1.4: Variables: Scope Ctx Expr S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assign S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (assign S1 Expr) N Ctx'
< Or: apply mems_or_not_mems to IsCtx IsS1. Subgoal 1.4: Variables: Scope Ctx Expr S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assign S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N Or : mems S1 (Scope::Ctx) \/ not_mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (assign S1 Expr) N Ctx'
< case Or. Subgoal 1.4.1: Variables: Scope Ctx Expr S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assign S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N H2 : mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (assign S1 Expr) N Ctx'
< search. Subgoal 1.4.2: Variables: Scope Ctx Expr S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assign S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N H2 : not_mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (assign S1 Expr) N Ctx'
< search. Subgoal 1.5: Variables: Scope Ctx Expr L S1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (recUpdate S1 L Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_list is_string L IsS3 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (recUpdate S1 L Expr) N Ctx'
< apply IH_E to IsS3 _. Subgoal 1.5: Variables: Scope Ctx Expr L S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (recUpdate S1 L Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_list is_string L IsS3 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (recUpdate S1 L Expr) N Ctx'
< Or: apply mems_or_not_mems to IsCtx IsS1. Subgoal 1.5: Variables: Scope Ctx Expr L S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (recUpdate S1 L Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_list is_string L IsS3 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N Or : mems S1 (Scope::Ctx) \/ not_mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (recUpdate S1 L Expr) N Ctx'
< case Or. Subgoal 1.5.1: Variables: Scope Ctx Expr L S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (recUpdate S1 L Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_list is_string L IsS3 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N H2 : mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (recUpdate S1 L Expr) N Ctx'
< search. Subgoal 1.5.2: Variables: Scope Ctx Expr L S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (recUpdate S1 L Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_list is_string L IsS3 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N H2 : not_mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (recUpdate S1 L Expr) N Ctx'
< search. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< NC: apply IH_E to IsS1 _. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< NT: apply IH_S to IsS2 _ with Ctx = Scope::Ctx. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< NF: apply IH_S to IsS3 _ with Ctx = Scope::Ctx. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< IsN: apply exprNames_is to _ _ NC. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 IsN : is_list is_string N ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< IsN1: apply stmtNames_is to _ _ NT. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< IsN2: apply stmtNames_is to _ _ NF. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 IsN : is_list is_string N IsN1 : is_list is_string N1 IsN2 : is_list is_string N2 ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< App: apply append_list_string_total to IsN IsN1. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 IsN : is_list is_string N IsN1 : is_list is_string N1 IsN2 : is_list is_string N2 App : N ++ N1 = L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< IsL3: apply append_list_string_is to _ _ App. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 IsN : is_list is_string N IsN1 : is_list is_string N1 IsN2 : is_list is_string N2 App : N ++ N1 = L3 IsL3 : is_list is_string L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< apply append_list_string_total to IsL3 IsN2. Subgoal 1.6: Variables: Scope Ctx Stmt Stmt1 Expr N N1 Ctx' N2 Ctx'1 L3 L1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (ifThenElse Expr Stmt1 Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt1 * IsS3 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NT : stmtNames ([]::(Scope::Ctx)) Stmt1 N1 Ctx' NF : stmtNames ([]::(Scope::Ctx)) Stmt N2 Ctx'1 IsN : is_list is_string N IsN1 : is_list is_string N1 IsN2 : is_list is_string N2 App : N ++ N1 = L3 IsL3 : is_list is_string L3 H1 : L3 ++ N2 = L1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (ifThenElse Expr Stmt1 Stmt) N Ctx'
< search. Subgoal 1.7: Variables: Scope Ctx Stmt Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (while Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt * ============================ exists N Ctx', stmtNames (Scope::Ctx) (while Expr Stmt) N Ctx'
< NC: apply IH_E to IsS1 _. Subgoal 1.7: Variables: Scope Ctx Stmt Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (while Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (while Expr Stmt) N Ctx'
< NB: apply IH_S to IsS2 _ with Ctx = Scope::Ctx. Subgoal 1.7: Variables: Scope Ctx Stmt Expr N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (while Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NB : stmtNames ([]::(Scope::Ctx)) Stmt N1 Ctx' ============================ exists N Ctx', stmtNames (Scope::Ctx) (while Expr Stmt) N Ctx'
< IsN: apply exprNames_is to _ _ NC. Subgoal 1.7: Variables: Scope Ctx Stmt Expr N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (while Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NB : stmtNames ([]::(Scope::Ctx)) Stmt N1 Ctx' IsN : is_list is_string N ============================ exists N Ctx', stmtNames (Scope::Ctx) (while Expr Stmt) N Ctx'
< IsN1: apply stmtNames_is to _ _ NB. Subgoal 1.7: Variables: Scope Ctx Stmt Expr N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (while Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NB : stmtNames ([]::(Scope::Ctx)) Stmt N1 Ctx' IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (while Expr Stmt) N Ctx'
< apply append_list_string_total to IsN IsN1. Subgoal 1.7: Variables: Scope Ctx Stmt Expr N N1 Ctx' L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (while Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * IsS2 : is_stmt Stmt * NC : exprNames (Scope::Ctx) Expr N NB : stmtNames ([]::(Scope::Ctx)) Stmt N1 Ctx' IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (while Expr Stmt) N Ctx'
< search. Subgoal 1.8: Variables: Scope Ctx Stmt IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (scopeStmt Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt * ============================ exists N Ctx', stmtNames (Scope::Ctx) (scopeStmt Stmt) N Ctx'
< SN: apply IH_S to IsS1 _ with Ctx = Scope::Ctx. Subgoal 1.8: Variables: Scope Ctx Stmt N Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (scopeStmt Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_stmt Stmt * SN : stmtNames ([]::(Scope::Ctx)) Stmt N Ctx' ============================ exists N Ctx', stmtNames (Scope::Ctx) (scopeStmt Stmt) N Ctx'
< search. Subgoal 1.9: Variables: Scope Ctx Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (printVal Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (printVal Expr) N Ctx'
< apply IH_E to IsS1 _. Subgoal 1.9: Variables: Scope Ctx Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (printVal Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (printVal Expr) N Ctx'
< search. Subgoal 2.1: Variables: Ctx I IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (num I) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_integer I ============================ exists N, exprNames Ctx (num I) N
< search. Subgoal 2.2: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (plus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (plus Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.2: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (plus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (plus Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.2: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (plus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (plus Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.2: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (plus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (plus Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.2: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (plus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (plus Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.2: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (plus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (plus Expr1 Expr) N
< search. Subgoal 2.3: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (minus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (minus Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.3: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (minus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (minus Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.3: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (minus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (minus Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.3: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (minus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (minus Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.3: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (minus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (minus Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.3: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (minus Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (minus Expr1 Expr) N
< search. Subgoal 2.4: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (mult Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (mult Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.4: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (mult Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (mult Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.4: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (mult Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (mult Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.4: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (mult Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (mult Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.4: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (mult Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (mult Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.4: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (mult Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (mult Expr1 Expr) N
< search. Subgoal 2.5: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (div Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (div Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.5: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (div Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (div Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.5: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (div Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (div Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.5: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (div Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (div Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.5: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (div Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (div Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.5: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (div Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (div Expr1 Expr) N
< search. Subgoal 2.6: Variables: Ctx IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr true @ IsCtx : is_list (is_list is_string) Ctx ============================ exists N, exprNames Ctx true N
< search. Subgoal 2.7: Variables: Ctx IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr false @ IsCtx : is_list (is_list is_string) Ctx ============================ exists N, exprNames Ctx false N
< search. Subgoal 2.8: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (and Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (and Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.8: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (and Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (and Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.8: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (and Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (and Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.8: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (and Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (and Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.8: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (and Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (and Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.8: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (and Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (and Expr1 Expr) N
< search. Subgoal 2.9: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (or Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (or Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.9: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (or Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (or Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.9: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (or Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (or Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.9: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (or Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (or Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.9: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (or Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (or Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.9: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (or Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (or Expr1 Expr) N
< search. Subgoal 2.10: Variables: Ctx Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (not Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * ============================ exists N, exprNames Ctx (not Expr) N
< apply IH_E to IsE1 _. Subgoal 2.10: Variables: Ctx Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (not Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (not Expr) N
< search. Subgoal 2.11: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (greater Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (greater Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.11: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (greater Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (greater Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.11: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (greater Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (greater Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.11: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (greater Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (greater Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.11: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (greater Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (greater Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.11: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (greater Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (greater Expr1 Expr) N
< search. Subgoal 2.12: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (eq Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (eq Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.12: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (eq Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (eq Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.12: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (eq Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (eq Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.12: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (eq Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (eq Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.12: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (eq Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (eq Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.12: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (eq Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (eq Expr1 Expr) N
< search. Subgoal 2.13: Variables: Ctx S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stringLit S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S ============================ exists N, exprNames Ctx (stringLit S) N
< search. Subgoal 2.14: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (appString Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (appString Expr1 Expr) N
< EN1: apply IH_E to IsE1 _. Subgoal 2.14: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (appString Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (appString Expr1 Expr) N
< EN2: apply IH_E to IsE2 _. Subgoal 2.14: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (appString Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (appString Expr1 Expr) N
< IsN: apply exprNames_is to _ _ EN1. Subgoal 2.14: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (appString Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (appString Expr1 Expr) N
< IsN1: apply exprNames_is to _ _ EN2. Subgoal 2.14: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (appString Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (appString Expr1 Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.14: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (appString Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (appString Expr1 Expr) N
< search. Subgoal 2.15: Variables: Ctx S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (name S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S ============================ exists N, exprNames Ctx (name S) N
< Or: apply mems_or_not_mems to IsCtx IsE1. Subgoal 2.15: Variables: Ctx S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (name S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S Or : mems S Ctx \/ not_mems S Ctx ============================ exists N, exprNames Ctx (name S) N
< case Or. Subgoal 2.15.1: Variables: Ctx S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (name S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S H1 : mems S Ctx ============================ exists N, exprNames Ctx (name S) N
< search. Subgoal 2.15.2: Variables: Ctx S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (name S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S H1 : not_mems S Ctx ============================ exists N, exprNames Ctx (name S) N
< search. Subgoal 2.16: Variables: Ctx Args S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (call S Args) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S IsE2 : is_args Args * ============================ exists N, exprNames Ctx (call S Args) N
< apply IH_A to IsE2 _. Subgoal 2.16: Variables: Ctx Args S N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (call S Args) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_string S IsE2 : is_args Args * H1 : argsNames Ctx Args N ============================ exists N, exprNames Ctx (call S Args) N
< search. Subgoal 2.17: Variables: Ctx Expr Stmt IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< SN: apply IH_S to IsE1 _ with Ctx = Ctx Scope = []. Subgoal 2.17: Variables: Ctx Expr Stmt N Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * SN : stmtNames ([]::Ctx) Stmt N Ctx' ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< IsC': apply stmtNames_isCtx to _ _ SN. Subgoal 2.17: Variables: Ctx Expr Stmt N Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * SN : stmtNames ([]::Ctx) Stmt N Ctx' IsC' : is_list (is_list is_string) Ctx' ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< EN: apply IH_E to IsE2 IsC'. Subgoal 2.17: Variables: Ctx Expr Stmt N Ctx' N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * SN : stmtNames ([]::Ctx) Stmt N Ctx' IsC' : is_list (is_list is_string) Ctx' EN : exprNames Ctx' Expr N1 ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< IsN: apply stmtNames_is to _ _ SN. Subgoal 2.17: Variables: Ctx Expr Stmt N Ctx' N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * SN : stmtNames ([]::Ctx) Stmt N Ctx' IsC' : is_list (is_list is_string) Ctx' EN : exprNames Ctx' Expr N1 IsN : is_list is_string N ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< IsN1: apply exprNames_is to _ _ EN. Subgoal 2.17: Variables: Ctx Expr Stmt N Ctx' N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * SN : stmtNames ([]::Ctx) Stmt N Ctx' IsC' : is_list (is_list is_string) Ctx' EN : exprNames Ctx' Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< apply append_list_string_total to IsN IsN1. Subgoal 2.17: Variables: Ctx Expr Stmt N Ctx' N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (stmtExpr Stmt Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_stmt Stmt * IsE2 : is_expr Expr * SN : stmtNames ([]::Ctx) Stmt N Ctx' IsC' : is_list (is_list is_string) Ctx' EN : exprNames Ctx' Expr N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (stmtExpr Stmt Expr) N
< search. Subgoal 2.18: Variables: Ctx RecFieldExprs IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (recBuild RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_recFieldExprs RecFieldExprs * ============================ exists N, exprNames Ctx (recBuild RecFieldExprs) N
< apply IH_RF to IsE1 _. Subgoal 2.18: Variables: Ctx RecFieldExprs N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (recBuild RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_recFieldExprs RecFieldExprs * H1 : recFieldNames Ctx RecFieldExprs N ============================ exists N, exprNames Ctx (recBuild RecFieldExprs) N
< search. Subgoal 2.19: Variables: Ctx S Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (recFieldAccess Expr S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * IsE2 : is_string S ============================ exists N, exprNames Ctx (recFieldAccess Expr S) N
< apply IH_E to IsE1 _. Subgoal 2.19: Variables: Ctx S Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (recFieldAccess Expr S) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * IsE2 : is_string S H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (recFieldAccess Expr S) N
< search. Subgoal 2.20: Variables: Ctx Typ Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (errorExpr Expr Typ) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * IsE2 : is_typ Typ ============================ exists N, exprNames Ctx (errorExpr Expr Typ) N
< apply IH_E to IsE1 _. Subgoal 2.20: Variables: Ctx Typ Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (errorExpr Expr Typ) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * IsE2 : is_typ Typ H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (errorExpr Expr Typ) N
< search. Subgoal 3.1: Variables: Ctx IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args nilArgs @ IsCtx : is_list (is_list is_string) Ctx ============================ exists N, argsNames Ctx nilArgs N
< search. Subgoal 3.2: Variables: Ctx Args Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args (consArgs Expr Args) @ IsCtx : is_list (is_list is_string) Ctx IsA1 : is_expr Expr * IsA2 : is_args Args * ============================ exists N, argsNames Ctx (consArgs Expr Args) N
< EN: apply IH_E to IsA1 _. Subgoal 3.2: Variables: Ctx Args Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args (consArgs Expr Args) @ IsCtx : is_list (is_list is_string) Ctx IsA1 : is_expr Expr * IsA2 : is_args Args * EN : exprNames Ctx Expr N ============================ exists N, argsNames Ctx (consArgs Expr Args) N
< AN: apply IH_A to IsA2 _. Subgoal 3.2: Variables: Ctx Args Expr N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args (consArgs Expr Args) @ IsCtx : is_list (is_list is_string) Ctx IsA1 : is_expr Expr * IsA2 : is_args Args * EN : exprNames Ctx Expr N AN : argsNames Ctx Args N1 ============================ exists N, argsNames Ctx (consArgs Expr Args) N
< IsN: apply exprNames_is to _ _ EN. Subgoal 3.2: Variables: Ctx Args Expr N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args (consArgs Expr Args) @ IsCtx : is_list (is_list is_string) Ctx IsA1 : is_expr Expr * IsA2 : is_args Args * EN : exprNames Ctx Expr N AN : argsNames Ctx Args N1 IsN : is_list is_string N ============================ exists N, argsNames Ctx (consArgs Expr Args) N
< IsN1: apply argsNames_is to _ _ AN. Subgoal 3.2: Variables: Ctx Args Expr N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args (consArgs Expr Args) @ IsCtx : is_list (is_list is_string) Ctx IsA1 : is_expr Expr * IsA2 : is_args Args * EN : exprNames Ctx Expr N AN : argsNames Ctx Args N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, argsNames Ctx (consArgs Expr Args) N
< apply append_list_string_total to IsN IsN1. Subgoal 3.2: Variables: Ctx Args Expr N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsA : is_args (consArgs Expr Args) @ IsCtx : is_list (is_list is_string) Ctx IsA1 : is_expr Expr * IsA2 : is_args Args * EN : exprNames Ctx Expr N AN : argsNames Ctx Args N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, argsNames Ctx (consArgs Expr Args) N
< search. Subgoal 4.1: Variables: Ctx IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs nilRecFieldExprs @ IsCtx : is_list (is_list is_string) Ctx ============================ exists N, recFieldNames Ctx nilRecFieldExprs N
< search. Subgoal 4.2: Variables: Ctx RecFieldExprs Expr S IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * ============================ exists N, recFieldNames Ctx (consRecFieldExprs S Expr RecFieldExprs) N
< EN: apply IH_E to IsRF2 _. Subgoal 4.2: Variables: Ctx RecFieldExprs Expr S N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * EN : exprNames Ctx Expr N ============================ exists N, recFieldNames Ctx (consRecFieldExprs S Expr RecFieldExprs) N
< RFN: apply IH_RF to IsRF3 _. Subgoal 4.2: Variables: Ctx RecFieldExprs Expr S N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * EN : exprNames Ctx Expr N RFN : recFieldNames Ctx RecFieldExprs N1 ============================ exists N, recFieldNames Ctx (consRecFieldExprs S Expr RecFieldExprs) N
< IsN: apply exprNames_is to _ _ EN. Subgoal 4.2: Variables: Ctx RecFieldExprs Expr S N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * EN : exprNames Ctx Expr N RFN : recFieldNames Ctx RecFieldExprs N1 IsN : is_list is_string N ============================ exists N, recFieldNames Ctx (consRecFieldExprs S Expr RecFieldExprs) N
< IsN1: apply recFieldNames_is to _ _ RFN. Subgoal 4.2: Variables: Ctx RecFieldExprs Expr S N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * EN : exprNames Ctx Expr N RFN : recFieldNames Ctx RecFieldExprs N1 IsN : is_list is_string N IsN1 : is_list is_string N1 ============================ exists N, recFieldNames Ctx (consRecFieldExprs S Expr RecFieldExprs) N
< apply append_list_string_total to IsN IsN1. Subgoal 4.2: Variables: Ctx RecFieldExprs Expr S N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsRF : is_recFieldExprs (consRecFieldExprs S Expr RecFieldExprs) @ IsCtx : is_list (is_list is_string) Ctx IsRF1 : is_string S IsRF2 : is_expr Expr * IsRF3 : is_recFieldExprs RecFieldExprs * EN : exprNames Ctx Expr N RFN : recFieldNames Ctx RecFieldExprs N1 IsN : is_list is_string N IsN1 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, recFieldNames Ctx (consRecFieldExprs S Expr RecFieldExprs) N
< search. Proof completed.
< Extensible_Theorem stmtNames_not_in_ctx : forall Scope Ctx S N Ctx' X, IsS : is_stmt S -> IsCtx : is_list (is_list is_string) (Scope::Ctx) -> SN : stmtNames (Scope::Ctx) S N Ctx' -> MemN : mem X N -> MemsCtx : mems X (Scope::Ctx) -> false on SN as IH_S, exprNames_not_in_ctx : forall Ctx E N X, IsE : is_expr E -> IsCtx : is_list (is_list is_string) Ctx -> EN : exprNames Ctx E N -> MemN : mem X N -> MemsCtx : mems X Ctx -> false on EN as IH_Ealso argsNames_not_in_ctx : forall Ctx A N X, IsA : is_args A -> IsCtx : is_list (is_list is_string) Ctx -> AN : argsNames Ctx A N -> MemN : mem X N -> MemsCtx : mems X Ctx -> false on AN as IH_A, recFieldNames_not_in_ctx : forall Ctx RF N X, IsRF : is_recFieldExprs RF -> IsCtx : is_list (is_list is_string) Ctx -> RFN : recFieldNames Ctx RF N -> MemN : mem X N -> MemsCtx : mems X Ctx -> false on RFN as IH_RF. Subgoal 1.1: Variables: Scope Ctx X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt noop IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) noop [] (Scope::Ctx) @ MemN : mem X [] MemsCtx : mems X (Scope::Ctx) ============================ false
< case MemN. Subgoal 1.2: Variables: Scope Ctx N Ctx' X N2 Ctx3 N3 S2 S1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (seq S1 S2) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N ============================ false
< case IsS. Subgoal 1.2: Variables: Scope Ctx N Ctx' X N2 Ctx3 N3 S2 S1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 Ctx3 * SN2 : stmtNames Ctx3 S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 ============================ false
< K: apply stmtNames_keep_older to _ _ SN1. Subgoal 1.2: Variables: Scope Ctx N Ctx' X N2 N3 S2 S1 Scope' IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' ============================ false
< apply stmtNames_isCtx to _ _ SN1. Subgoal 1.2: Variables: Scope Ctx N Ctx' X N2 N3 S2 S1 Scope' IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N Ctx' @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 Ctx' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) ============================ false
< K': apply stmtNames_keep_older to _ _ SN2. Subgoal 1.2: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 ============================ false
< Or: apply mem_append to MemN SN3. Subgoal 1.2: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 1.2.1: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N2 ============================ false
< apply IH_S to _ _ SN1 M MemsCtx. Subgoal 1.2.2: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N3 ============================ false
< MemsCtx': assert mems X (Scope'::Ctx). Subgoal 1.2.2.1: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N3 ============================ mems X (Scope'::Ctx)
< M': case MemsCtx. Subgoal 1.2.2.1.1: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N3 M' : mem X Scope ============================ mems X (Scope'::Ctx)
< apply K to M'. Subgoal 1.2.2.1.1: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N3 M' : mem X Scope H4 : mem X Scope' ============================ mems X (Scope'::Ctx)
< search. Subgoal 1.2.2.1.2: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N3 M' : mems X Ctx ============================ mems X (Scope'::Ctx)
< search. Subgoal 1.2.2: Variables: Scope Ctx N X N2 N3 S2 S1 Scope' Scope'1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (seq S1 S2) N (Scope'1::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames (Scope::Ctx) S1 N2 (Scope'::Ctx) * SN2 : stmtNames (Scope'::Ctx) S2 N3 (Scope'1::Ctx) * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 K : forall X, mem X Scope -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) K' : forall X, mem X Scope' -> mem X Scope'1 M : mem X N3 MemsCtx' : mems X (Scope'::Ctx) ============================ false
< apply IH_S to _ _ SN2 M MemsCtx'. Subgoal 1.3: Variables: Scope Ctx N X X1 E Ty IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (declare Ty X1 E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (declare Ty X1 E) N ((X1::Scope)::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E N * ============================ false
< case IsS. Subgoal 1.3: Variables: Scope Ctx N X X1 E Ty IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (declare Ty X1 E) N ((X1::Scope)::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E N * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E ============================ false
< apply IH_E to _ _ SN1 MemN MemsCtx. Subgoal 1.4: Variables: Scope Ctx N X E X1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (assign X1 E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X1 E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems X1 (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N * ============================ false
< case IsS. Subgoal 1.4: Variables: Scope Ctx N X E X1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X1 E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems X1 (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N * H1 : is_string X1 H2 : is_expr E ============================ false
< apply IH_E to _ _ SN2 MemN MemsCtx. Subgoal 1.5: Variables: Scope Ctx X N1 X1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (assign X1 E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X1 E) (X1::N1) (Scope::Ctx) @ MemN : mem X (X1::N1) MemsCtx : mems X (Scope::Ctx) SN1 : not_mems X1 (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * ============================ false
< case IsS. Subgoal 1.5: Variables: Scope Ctx X N1 X1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X1 E) (X1::N1) (Scope::Ctx) @ MemN : mem X (X1::N1) MemsCtx : mems X (Scope::Ctx) SN1 : not_mems X1 (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * H1 : is_string X1 H2 : is_expr E ============================ false
< MN: case MemN. Subgoal 1.5.1: Variables: Scope Ctx N1 X1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X1 E) (X1::N1) (Scope::Ctx) @ MemsCtx : mems X1 (Scope::Ctx) SN1 : not_mems X1 (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * H1 : is_string X1 H2 : is_expr E ============================ false
< apply not_mems to SN1 MemsCtx. Subgoal 1.5.2: Variables: Scope Ctx X N1 X1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assign X1 E) (X1::N1) (Scope::Ctx) @ MemsCtx : mems X (Scope::Ctx) SN1 : not_mems X1 (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * H1 : is_string X1 H2 : is_expr E MN : mem X N1 ============================ false
< apply IH_E to _ _ SN2 MN MemsCtx. Subgoal 1.6: Variables: Scope Ctx N X E Fields R IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N * ============================ false
< case IsS. Subgoal 1.6: Variables: Scope Ctx N X E Fields R IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ false
< apply IH_E to _ _ SN2 MemN MemsCtx. Subgoal 1.7: Variables: Scope Ctx X N1 R E Fields IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (recUpdate R Fields E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) (R::N1) (Scope::Ctx) @ MemN : mem X (R::N1) MemsCtx : mems X (Scope::Ctx) SN1 : not_mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * ============================ false
< case IsS. Subgoal 1.7: Variables: Scope Ctx X N1 R E Fields IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) (R::N1) (Scope::Ctx) @ MemN : mem X (R::N1) MemsCtx : mems X (Scope::Ctx) SN1 : not_mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ false
< MN: case MemN. Subgoal 1.7.1: Variables: Scope Ctx N1 R E Fields IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) (R::N1) (Scope::Ctx) @ MemsCtx : mems R (Scope::Ctx) SN1 : not_mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ false
< apply not_mems to SN1 MemsCtx. Subgoal 1.7.2: Variables: Scope Ctx X N1 R E Fields IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (recUpdate R Fields E) (R::N1) (Scope::Ctx) @ MemsCtx : mems X (Scope::Ctx) SN1 : not_mems R (Scope::Ctx) SN2 : exprNames (Scope::Ctx) E N1 * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E MN : mem X N1 ============================ false
< apply IH_E to _ _ SN2 MN MemsCtx. Subgoal 1.8: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (ifThenElse C T F) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N ============================ false
< case IsS. Subgoal 1.8: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ false
< Or: apply mem_append to MemN SN5. Subgoal 1.8: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F Or : mem X N2 \/ mem X FN ============================ false
< M: case Or. Subgoal 1.8.1: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F M : mem X N2 ============================ false
< Or: apply mem_append to M SN4. Subgoal 1.8.1: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F M : mem X N2 Or : mem X CN \/ mem X TN ============================ false
< M': case Or. Subgoal 1.8.1.1: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F M : mem X N2 M' : mem X CN ============================ false
< apply IH_E to _ _ SN1 M' MemsCtx. Subgoal 1.8.1.2: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F M : mem X N2 M' : mem X TN ============================ false
< apply IH_S to _ _ SN2 M' _. Subgoal 1.8.2: Variables: Scope Ctx N X CN TN CtxT FN CtxF N2 F T C IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (ifThenElse C T F) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) C CN * SN2 : stmtNames ([]::(Scope::Ctx)) T TN CtxT * SN3 : stmtNames ([]::(Scope::Ctx)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F M : mem X FN ============================ false
< apply IH_S to _ _ SN3 M _. Subgoal 1.9: Variables: Scope Ctx N X CN BN CtxB Body Cond IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (while Cond Body) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (while Cond Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) Cond CN * SN2 : stmtNames ([]::(Scope::Ctx)) Body BN CtxB * SN3 : CN ++ BN = N ============================ false
< case IsS. Subgoal 1.9: Variables: Scope Ctx N X CN BN CtxB Body Cond IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (while Cond Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) Cond CN * SN2 : stmtNames ([]::(Scope::Ctx)) Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body ============================ false
< Or: apply mem_append to MemN SN3. Subgoal 1.9: Variables: Scope Ctx N X CN BN CtxB Body Cond IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (while Cond Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) Cond CN * SN2 : stmtNames ([]::(Scope::Ctx)) Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body Or : mem X CN \/ mem X BN ============================ false
< M: case Or. Subgoal 1.9.1: Variables: Scope Ctx N X CN BN CtxB Body Cond IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (while Cond Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) Cond CN * SN2 : stmtNames ([]::(Scope::Ctx)) Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body M : mem X CN ============================ false
< apply IH_E to _ _ SN1 M MemsCtx. Subgoal 1.9.2: Variables: Scope Ctx N X CN BN CtxB Body Cond IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (while Cond Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) Cond CN * SN2 : stmtNames ([]::(Scope::Ctx)) Body BN CtxB * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body M : mem X BN ============================ false
< apply IH_S to _ _ SN2 M _. Subgoal 1.10: Variables: Scope Ctx N X Ctx2 S1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (scopeStmt S1) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (scopeStmt S1) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames ([]::(Scope::Ctx)) S1 N Ctx2 * ============================ false
< case IsS. Subgoal 1.10: Variables: Scope Ctx N X Ctx2 S1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (scopeStmt S1) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : stmtNames ([]::(Scope::Ctx)) S1 N Ctx2 * H1 : is_stmt S1 ============================ false
< apply IH_S to _ _ SN1 MemN _. Subgoal 1.11: Variables: Scope Ctx N X E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (printVal E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (printVal E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E N * ============================ false
< case IsS. Subgoal 1.11: Variables: Scope Ctx N X E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (printVal E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E N * H1 : is_expr E ============================ false
< apply IH_E to _ _ SN1 MemN MemsCtx. Subgoal 2.1: Variables: Ctx X I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (num I) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (num I) [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 2.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (plus E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.2.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.2.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (plus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.3: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (minus E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.3: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.3: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.3.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.3.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (minus E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.4: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (mult E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.4: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.4: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.4.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.4.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (mult E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.5: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (div E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.5: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.5: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.5.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.5.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (div E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.6: Variables: Ctx X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr true IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx true [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 2.7: Variables: Ctx X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx false [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 2.8: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (and E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.8: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.8: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.8.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.8.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (and E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.9: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (or E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.9: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.9: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.9.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.9.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (or E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.10: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (not E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (not E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.10: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (not E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Subgoal 2.11: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (greater E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.11: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.11: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.11.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.11.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (greater E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.12: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (eq E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.12: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.12: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.12.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.12.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (eq E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.13: Variables: Ctx X S IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (stringLit S) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stringLit S) [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 2.14: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (appString E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.14: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.14: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.14.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.14.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (appString E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.15: Variables: Ctx X X1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (name X1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X1) [] @ MemN : mem X [] MemsCtx : mems X Ctx EN1 : mems X1 Ctx ============================ false
< case MemN. Subgoal 2.16: Variables: Ctx X X1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (name X1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X1) [X1] @ MemN : mem X [X1] MemsCtx : mems X Ctx EN1 : not_mems X1 Ctx ============================ false
< M: case MemN. Subgoal 2.16.1: Variables: Ctx X1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (name X1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X1) [X1] @ MemsCtx : mems X1 Ctx EN1 : not_mems X1 Ctx ============================ false
< apply not_mems to EN1 MemsCtx. Subgoal 2.16.2: Variables: Ctx X X1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (name X1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (name X1) [X1] @ MemsCtx : mems X Ctx EN1 : not_mems X1 Ctx M : mem X [] ============================ false
< case M. Subgoal 2.17: Variables: Ctx N X Args F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (call F Args) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (call F Args) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : argsNames Ctx Args N * ============================ false
< case IsE. Subgoal 2.17: Variables: Ctx N X Args F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (call F Args) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : argsNames Ctx Args N * H1 : is_string F H2 : is_args Args ============================ false
< apply IH_A to _ _ EN1 MemN MemsCtx. Subgoal 2.18: Variables: Ctx N X NS CtxS NE E1 S IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (stmtExpr S E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N ============================ false
< case IsE. Subgoal 2.18: Variables: Ctx N X NS CtxS NE E1 S IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.18: Variables: Ctx N X NS CtxS NE E1 S IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 Or : mem X NS \/ mem X NE ============================ false
< M: case Or. Subgoal 2.18.1: Variables: Ctx N X NS CtxS NE E1 S IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 M : mem X NS ============================ false
< apply IH_S to _ _ EN1 M _. Subgoal 2.18.2: Variables: Ctx N X NS CtxS NE E1 S IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 M : mem X NE ============================ false
< K: apply stmtNames_keep_older to _ _ EN1. Subgoal 2.18.2: Variables: Ctx N X NS NE E1 S Scope' IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS (Scope'::Ctx) * EN2 : exprNames (Scope'::Ctx) E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 M : mem X NE K : forall X, mem X [] -> mem X Scope' ============================ false
< apply stmtNames_isCtx to _ _ EN1. Subgoal 2.18.2: Variables: Ctx N X NS NE E1 S Scope' IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (stmtExpr S E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : stmtNames ([]::Ctx) S NS (Scope'::Ctx) * EN2 : exprNames (Scope'::Ctx) E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 M : mem X NE K : forall X, mem X [] -> mem X Scope' H3 : is_list (is_list is_string) (Scope'::Ctx) ============================ false
< apply IH_E to _ _ EN2 M _. Subgoal 2.19: Variables: Ctx N X RF IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (recBuild RF) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recBuild RF) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : recFieldNames Ctx RF N * ============================ false
< case IsE. Subgoal 2.19: Variables: Ctx N X RF IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recBuild RF) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : recFieldNames Ctx RF N * H1 : is_recFieldExprs RF ============================ false
< apply IH_RF to _ _ EN1 MemN MemsCtx. Subgoal 2.20: Variables: Ctx N X F E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (recFieldAccess E1 F) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recFieldAccess E1 F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.20: Variables: Ctx N X F E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (recFieldAccess E1 F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_string F ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Subgoal 2.21: Variables: Ctx N X Ty E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (errorExpr E1 Ty) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (errorExpr E1 Ty) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.21: Variables: Ctx N X Ty E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (errorExpr E1 Ty) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_typ Ty ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Subgoal 3: Variables: Ctx A N X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsA : is_args A IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx A N @ MemN : mem X N MemsCtx : mems X Ctx ============================ false
< AN: case AN (keep). Subgoal 3.1: Variables: Ctx X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsA : is_args nilArgs IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx nilArgs [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 3.2: Variables: Ctx N X EN AN A1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsA : is_args (consArgs E A1) IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ MemN : mem X N MemsCtx : mems X Ctx AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N ============================ false
< case IsA. Subgoal 3.2: Variables: Ctx N X EN AN A1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ MemN : mem X N MemsCtx : mems X Ctx AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 ============================ false
< Or: apply mem_append to MemN AN3. Subgoal 3.2: Variables: Ctx N X EN AN A1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ MemN : mem X N MemsCtx : mems X Ctx AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 Or : mem X EN \/ mem X AN ============================ false
< M: case Or. Subgoal 3.2.1: Variables: Ctx N X EN AN A1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ MemN : mem X N MemsCtx : mems X Ctx AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 M : mem X EN ============================ false
< apply IH_E to _ _ AN1 M MemsCtx. Subgoal 3.2.2: Variables: Ctx N X EN AN A1 E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx AN : argsNames Ctx (consArgs E A1) N @ MemN : mem X N MemsCtx : mems X Ctx AN1 : exprNames Ctx E EN * AN2 : argsNames Ctx A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 M : mem X AN ============================ false
< apply IH_A to _ _ AN2 M MemsCtx. Subgoal 4: Variables: Ctx RF N X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsRF : is_recFieldExprs RF IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx RF N @ MemN : mem X N MemsCtx : mems X Ctx ============================ false
< RFN: case RFN (keep). Subgoal 4.1: Variables: Ctx X IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsRF : is_recFieldExprs nilRecFieldExprs IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx nilRecFieldExprs [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 4.2: Variables: Ctx N X EN RN RF1 E F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ MemN : mem X N MemsCtx : mems X Ctx RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N ============================ false
< case IsRF. Subgoal 4.2: Variables: Ctx N X EN RN RF1 E F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ MemN : mem X N MemsCtx : mems X Ctx RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ false
< Or: apply mem_append to MemN RFN3. Subgoal 4.2: Variables: Ctx N X EN RN RF1 E F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ MemN : mem X N MemsCtx : mems X Ctx RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 Or : mem X EN \/ mem X RN ============================ false
< M: case Or. Subgoal 4.2.1: Variables: Ctx N X EN RN RF1 E F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ MemN : mem X N MemsCtx : mems X Ctx RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 M : mem X EN ============================ false
< apply IH_E to _ _ RFN1 M MemsCtx. Subgoal 4.2.2: Variables: Ctx N X EN RN RF1 E F IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E RF1) N @ MemN : mem X N MemsCtx : mems X Ctx RFN1 : exprNames Ctx E EN * RFN2 : recFieldNames Ctx RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 M : mem X RN ============================ false
< apply IH_RF to _ _ RFN2 M MemsCtx. Proof completed.
< Extensible_Theorem stmtNames_relatedCtxs : forall ScopeA CtxA S N CtxA' ScopeB CtxB, IsS : is_stmt S -> IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) -> IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) -> RelAB : (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> RelBA : (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> SN : stmtNames (ScopeA::CtxA) S N CtxA' -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' on SN as IH_S, stmtNames_relatedCtxs_ctx_fwd : forall CtxA S NA CtxA' CtxB NB CtxB' X, IsS : is_stmt S -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> SNA : stmtNames CtxA S NA CtxA' -> SNB : stmtNames CtxB S NB CtxB' -> Mems : mems X CtxA' -> mems X CtxB' on SNA as IH_S_CAB, stmtNames_relatedCtxs_ctx_back : forall CtxA S NA CtxA' CtxB NB CtxB' X, IsS : is_stmt S -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelBA : (forall X, mems X CtxB -> mems X CtxA) -> SNA : stmtNames CtxA S NA CtxA' -> SNB : stmtNames CtxB S NB CtxB' -> Mems : mems X CtxB' -> mems X CtxA' on SNA as IH_S_CBA, exprNames_relatedCtxs : forall CtxA CtxB E N, IsE : is_expr E -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> RelBA : (forall X, mems X CtxB -> mems X CtxA) -> EN : exprNames CtxA E N -> exprNames CtxB E N on EN as IH_Ealso argsNames_relatedCtxs : forall CtxA CtxB A N, IsA : is_args A -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> RelBA : (forall X, mems X CtxB -> mems X CtxA) -> AN : argsNames CtxA A N -> argsNames CtxB A N on AN as IH_A, recFieldNames_relatedCtxs : forall CtxA CtxB RF N, IsRF : is_recFieldExprs RF -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> RelBA : (forall X, mems X CtxB -> mems X CtxA) -> RFN : recFieldNames CtxA RF N -> recFieldNames CtxB RF N on RFN as IH_RF. Subgoal 1.1: Variables: ScopeA CtxA ScopeB CtxB IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) noop [] (ScopeA::CtxA) @ ============================ exists CtxB', stmtNames (ScopeB::CtxB) noop [] CtxB'
< search. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 Ctx1 N3 S2 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (seq S1 S2) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 Ctx1 * SN2 : stmtNames Ctx1 S2 N3 CtxA' * SN3 : N2 ++ N3 = N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< case IsS. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 Ctx1 N3 S2 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 Ctx1 * SN2 : stmtNames Ctx1 S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< B1: apply IH_S to _ _ _ RelAB RelBA SN1. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 Ctx1 N3 S2 S1 CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 Ctx1 * SN2 : stmtNames Ctx1 S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 CtxB' ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< K1: apply stmtNames_keep_older to _ _ SN1. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 CtxB' Scope' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 CtxB' K1 : forall X, mem X ScopeA -> mem X Scope' ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< KB: apply stmtNames_keep_older to _ _ B1. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< apply stmtNames_isCtx to _ _ SN1. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< apply stmtNames_isCtx to _ _ B1. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< apply IH_S to _ _ _ _ _ SN2 with CtxB = CtxB ScopeB = Scope'1. Subgoal 1.2.1: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) ============================ forall X, mems X (Scope'1::CtxB) -> mems X (Scope'::CtxA)
< intros M. Subgoal 1.2.1: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) M : mems X (Scope'1::CtxB) ============================ mems X (Scope'::CtxA)
< apply IH_S_CBA to _ _ _ RelBA SN1 B1 M. Subgoal 1.2.1: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) M : mems X (Scope'1::CtxB) H5 : mems X (Scope'::CtxA) ============================ mems X (Scope'::CtxA)
< search. Subgoal 1.2.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) ============================ forall X, mems X (Scope'::CtxA) -> mems X (Scope'1::CtxB)
< intros M. Subgoal 1.2.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) M : mems X (Scope'::CtxA) ============================ mems X (Scope'1::CtxB)
< apply IH_S_CAB to _ _ _ RelAB SN1 B1 M. Subgoal 1.2.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) M : mems X (Scope'::CtxA) H5 : mems X (Scope'1::CtxB) ============================ mems X (Scope'1::CtxB)
< search. Subgoal 1.2: Variables: ScopeA CtxA N CtxA' ScopeB CtxB N2 N3 S2 S1 Scope' Scope'1 CtxB'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (seq S1 S2) N CtxA' @ SN1 : stmtNames (ScopeA::CtxA) S1 N2 (Scope'::CtxA) * SN2 : stmtNames (Scope'::CtxA) S2 N3 CtxA' * SN3 : N2 ++ N3 = N H1 : is_stmt S1 H2 : is_stmt S2 B1 : stmtNames (ScopeB::CtxB) S1 N2 (Scope'1::CtxB) K1 : forall X, mem X ScopeA -> mem X Scope' KB : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) H5 : stmtNames (Scope'1::CtxB) S2 N3 CtxB'1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (seq S1 S2) N CtxB'
< search. Subgoal 1.3: Variables: ScopeA CtxA N ScopeB CtxB X E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (declare Ty X E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (declare Ty X E) N ((X::ScopeA)::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (declare Ty X E) N CtxB'
< case IsS. Subgoal 1.3: Variables: ScopeA CtxA N ScopeB CtxB X E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (declare Ty X E) N ((X::ScopeA)::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (declare Ty X E) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.3: Variables: ScopeA CtxA N ScopeB CtxB X E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (declare Ty X E) N ((X::ScopeA)::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : exprNames (ScopeB::CtxB) E N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (declare Ty X E) N CtxB'
< search. Subgoal 1.4: Variables: ScopeA CtxA N ScopeB CtxB E X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assign X E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) N (ScopeA::CtxA) @ SN1 : mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) N CtxB'
< case IsS. Subgoal 1.4: Variables: ScopeA CtxA N ScopeB CtxB E X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) N (ScopeA::CtxA) @ SN1 : mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X H2 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.4: Variables: ScopeA CtxA N ScopeB CtxB E X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) N (ScopeA::CtxA) @ SN1 : mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X H2 : is_expr E H3 : exprNames (ScopeB::CtxB) E N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) N CtxB'
< apply RelAB to SN1. Subgoal 1.4: Variables: ScopeA CtxA N ScopeB CtxB E X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) N (ScopeA::CtxA) @ SN1 : mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X H2 : is_expr E H3 : exprNames (ScopeB::CtxB) E N H4 : mems X (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) N CtxB'
< search. Subgoal 1.5: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assign X E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< Is: case IsS. Subgoal 1.5: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string X Is1 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.5: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string X Is1 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< Or: apply mems_or_not_mems to IsCtxB Is. Subgoal 1.5: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string X Is1 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 Or : mems X (ScopeB::CtxB) \/ not_mems X (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< M: case Or. Subgoal 1.5.1: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string X Is1 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 M : mems X (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< M': apply RelBA to M. Subgoal 1.5.1: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string X Is1 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 M : mems X (ScopeB::CtxB) M' : mems X (ScopeA::CtxA) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< apply not_mems to SN1 M'. Subgoal 1.5.2: Variables: ScopeA CtxA ScopeB CtxB N1 X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assign X E) (X::N1) (ScopeA::CtxA) @ SN1 : not_mems X (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string X Is1 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 M : not_mems X (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assign X E) (X::N1) CtxB'
< search. Subgoal 1.6: Variables: ScopeA CtxA N ScopeB CtxB E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) N (ScopeA::CtxA) @ SN1 : mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) N CtxB'
< case IsS. Subgoal 1.6: Variables: ScopeA CtxA N ScopeB CtxB E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) N (ScopeA::CtxA) @ SN1 : mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.6: Variables: ScopeA CtxA N ScopeB CtxB E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) N (ScopeA::CtxA) @ SN1 : mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E H4 : exprNames (ScopeB::CtxB) E N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) N CtxB'
< apply RelAB to SN1. Subgoal 1.6: Variables: ScopeA CtxA N ScopeB CtxB E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) N (ScopeA::CtxA) @ SN1 : mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E H4 : exprNames (ScopeB::CtxB) E N H5 : mems R (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) N CtxB'
< search. Subgoal 1.7: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< Is: case IsS. Subgoal 1.7: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.7: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< Or: apply mems_or_not_mems to IsCtxB Is. Subgoal 1.7: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 Or : mems R (ScopeB::CtxB) \/ not_mems R (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< M: case Or. Subgoal 1.7.1: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 M : mems R (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< M': apply RelBA to M. Subgoal 1.7.1: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 M : mems R (ScopeB::CtxB) M' : mems R (ScopeA::CtxA) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< apply not_mems to SN1 M'. Subgoal 1.7.2: Variables: ScopeA CtxA ScopeB CtxB N1 R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N1) (ScopeA::CtxA) @ SN1 : not_mems R (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) E N1 * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E H1 : exprNames (ScopeB::CtxB) E N1 M : not_mems R (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (recUpdate R Fields E) (R::N1) CtxB'
< search. Subgoal 1.8: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (ifThenElse C T F) N CtxB'
< case IsS. Subgoal 1.8: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ exists CtxB', stmtNames (ScopeB::CtxB) (ifThenElse C T F) N CtxB'
< BC: apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.8: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN ============================ exists CtxB', stmtNames (ScopeB::CtxB) (ifThenElse C T F) N CtxB'
< BT: apply IH_S to _ _ _ _ _ SN2 with ScopeB = [] CtxB = ScopeB::CtxB. Subgoal 1.8.1: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN ============================ forall X, mems X ([]::(ScopeB::CtxB)) -> mems X ([]::(ScopeA::CtxA))
< intros M. Subgoal 1.8.1: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mems X ([]::(ScopeB::CtxB)) ============================ mems X ([]::(ScopeA::CtxA))
< M: case M. Subgoal 1.8.1.1: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mem X [] ============================ mems X ([]::(ScopeA::CtxA))
< case M. Subgoal 1.8.1.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeA::CtxA))
< apply RelBA to M. Subgoal 1.8.1.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mems X (ScopeB::CtxB) H4 : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeA::CtxA))
< search. Subgoal 1.8.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN ============================ forall X, mems X ([]::(ScopeA::CtxA)) -> mems X ([]::(ScopeB::CtxB))
< intros M. Subgoal 1.8.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mems X ([]::(ScopeA::CtxA)) ============================ mems X ([]::(ScopeB::CtxB))
< M: case M. Subgoal 1.8.2.1: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mem X [] ============================ mems X ([]::(ScopeB::CtxB))
< case M. Subgoal 1.8.2.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeB::CtxB))
< apply RelAB to M. Subgoal 1.8.2.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN M : mems X (ScopeA::CtxA) H4 : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeB::CtxB))
< search. Subgoal 1.8: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' ============================ exists CtxB', stmtNames (ScopeB::CtxB) (ifThenElse C T F) N CtxB'
< BF: apply IH_S to _ _ _ _ _ SN3 with ScopeB = [] CtxB = ScopeB::CtxB. Subgoal 1.8.3: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' ============================ forall X, mems X ([]::(ScopeB::CtxB)) -> mems X ([]::(ScopeA::CtxA))
< intros M. Subgoal 1.8.3: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mems X ([]::(ScopeB::CtxB)) ============================ mems X ([]::(ScopeA::CtxA))
< M: case M. Subgoal 1.8.3.1: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mem X [] ============================ mems X ([]::(ScopeA::CtxA))
< case M. Subgoal 1.8.3.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeA::CtxA))
< apply RelBA to M. Subgoal 1.8.3.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mems X (ScopeB::CtxB) H4 : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeA::CtxA))
< search. Subgoal 1.8.4: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' ============================ forall X, mems X ([]::(ScopeA::CtxA)) -> mems X ([]::(ScopeB::CtxB))
< intros M. Subgoal 1.8.4: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mems X ([]::(ScopeA::CtxA)) ============================ mems X ([]::(ScopeB::CtxB))
< M: case M. Subgoal 1.8.4.1: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mem X [] ============================ mems X ([]::(ScopeB::CtxB))
< case M. Subgoal 1.8.4.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeB::CtxB))
< apply RelAB to M. Subgoal 1.8.4.2: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' M : mems X (ScopeA::CtxA) H4 : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeB::CtxB))
< search. Subgoal 1.8: Variables: ScopeA CtxA N ScopeB CtxB CN TN CtxT FN CtxF N2 F T C CtxB' CtxB'1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (ifThenElse C T F) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) C CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SN3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SN4 : CN ++ TN = N2 SN5 : N2 ++ FN = N H1 : is_expr C H2 : is_stmt T H3 : is_stmt F BC : exprNames (ScopeB::CtxB) C CN BT : stmtNames ([]::(ScopeB::CtxB)) T TN CtxB' BF : stmtNames ([]::(ScopeB::CtxB)) F FN CtxB'1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (ifThenElse C T F) N CtxB'
< search. Subgoal 1.9: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (while Cond Body) N CtxB'
< case IsS. Subgoal 1.9: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body ============================ exists CtxB', stmtNames (ScopeB::CtxB) (while Cond Body) N CtxB'
< BC: apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.9: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN ============================ exists CtxB', stmtNames (ScopeB::CtxB) (while Cond Body) N CtxB'
< BB: apply IH_S to _ _ _ _ _ SN2 with ScopeB = [] CtxB = ScopeB::CtxB. Subgoal 1.9.1: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN ============================ forall X, mems X ([]::(ScopeB::CtxB)) -> mems X ([]::(ScopeA::CtxA))
< intros M. Subgoal 1.9.1: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mems X ([]::(ScopeB::CtxB)) ============================ mems X ([]::(ScopeA::CtxA))
< M: case M. Subgoal 1.9.1.1: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mem X [] ============================ mems X ([]::(ScopeA::CtxA))
< case M. Subgoal 1.9.1.2: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeA::CtxA))
< apply RelBA to M. Subgoal 1.9.1.2: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mems X (ScopeB::CtxB) H3 : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeA::CtxA))
< search. Subgoal 1.9.2: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN ============================ forall X, mems X ([]::(ScopeA::CtxA)) -> mems X ([]::(ScopeB::CtxB))
< intros M. Subgoal 1.9.2: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mems X ([]::(ScopeA::CtxA)) ============================ mems X ([]::(ScopeB::CtxB))
< M: case M. Subgoal 1.9.2.1: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mem X [] ============================ mems X ([]::(ScopeB::CtxB))
< case M. Subgoal 1.9.2.2: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeB::CtxB))
< apply RelAB to M. Subgoal 1.9.2.2: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN M : mems X (ScopeA::CtxA) H3 : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeB::CtxB))
< search. Subgoal 1.9: Variables: ScopeA CtxA N ScopeB CtxB CN BN CtxB1 Body Cond CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (while Cond Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) Cond CN * SN2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SN3 : CN ++ BN = N H1 : is_expr Cond H2 : is_stmt Body BC : exprNames (ScopeB::CtxB) Cond CN BB : stmtNames ([]::(ScopeB::CtxB)) Body BN CtxB' ============================ exists CtxB', stmtNames (ScopeB::CtxB) (while Cond Body) N CtxB'
< search. Subgoal 1.10: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (scopeStmt S1) N CtxB'
< case IsS. Subgoal 1.10: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (scopeStmt S1) N CtxB'
< B: apply IH_S to _ _ _ _ _ SN1 with ScopeB = [] CtxB = ScopeB::CtxB. Subgoal 1.10.1: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 ============================ forall X, mems X ([]::(ScopeB::CtxB)) -> mems X ([]::(ScopeA::CtxA))
< intros M. Subgoal 1.10.1: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mems X ([]::(ScopeB::CtxB)) ============================ mems X ([]::(ScopeA::CtxA))
< M: case M. Subgoal 1.10.1.1: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mem X [] ============================ mems X ([]::(ScopeA::CtxA))
< case M. Subgoal 1.10.1.2: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeA::CtxA))
< apply RelBA to M. Subgoal 1.10.1.2: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mems X (ScopeB::CtxB) H2 : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeA::CtxA))
< search. Subgoal 1.10.2: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 ============================ forall X, mems X ([]::(ScopeA::CtxA)) -> mems X ([]::(ScopeB::CtxB))
< intros M. Subgoal 1.10.2: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mems X ([]::(ScopeA::CtxA)) ============================ mems X ([]::(ScopeB::CtxB))
< M: case M. Subgoal 1.10.2.1: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mem X [] ============================ mems X ([]::(ScopeB::CtxB))
< case M. Subgoal 1.10.2.2: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mems X (ScopeA::CtxA) ============================ mems X ([]::(ScopeB::CtxB))
< apply RelAB to M. Subgoal 1.10.2.2: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 M : mems X (ScopeA::CtxA) H2 : mems X (ScopeB::CtxB) ============================ mems X ([]::(ScopeB::CtxB))
< search. Subgoal 1.10: Variables: ScopeA CtxA N ScopeB CtxB Ctx1 S1 CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (scopeStmt S1) N (ScopeA::CtxA) @ SN1 : stmtNames ([]::(ScopeA::CtxA)) S1 N Ctx1 * H1 : is_stmt S1 B : stmtNames ([]::(ScopeB::CtxB)) S1 N CtxB' ============================ exists CtxB', stmtNames (ScopeB::CtxB) (scopeStmt S1) N CtxB'
< search. Subgoal 1.11: Variables: ScopeA CtxA N ScopeB CtxB E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (printVal E) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (printVal E) N CtxB'
< case IsS. Subgoal 1.11: Variables: ScopeA CtxA N ScopeB CtxB E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (printVal E) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * H1 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (printVal E) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.11: Variables: ScopeA CtxA N ScopeB CtxB E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (printVal E) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * H1 : is_expr E H2 : exprNames (ScopeB::CtxB) E N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (printVal E) N CtxB'
< search. Subgoal 2.1: Variables: CtxA' CtxB NB CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' noop [] CtxA' @ SNB : stmtNames CtxB noop NB CtxB' Mems : mems X CtxA' ============================ mems X CtxB'
< case SNB. Subgoal 2.1: Variables: CtxA' CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' noop [] CtxA' @ Mems : mems X CtxA' ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.1: Variables: CtxA' CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' noop [] CtxA' @ Mems : mems X CtxA' H1 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (seq S1 S2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ SNB : stmtNames CtxB (seq S1 S2) NB CtxB' Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ SNB : stmtNames CtxB (seq S1 S2) NB CtxB' Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB ============================ mems X CtxB'
< apply stmtNames_isCtx to _ _ SNA1. Subgoal 2.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 ============================ mems X CtxB'
< apply stmtNames_isCtx to _ _ SNB. Subgoal 2.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 ============================ mems X CtxB'
< apply IH_S_CAB to _ _ _ _ SNA2 SNB1 Mems. Subgoal 2.2.1: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 ============================ forall X1, mems X1 Ctx1 -> mems X1 Ctx2
< intros M. Subgoal 2.2.1: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M : mems X1 Ctx1 ============================ mems X1 Ctx2
< apply IH_S_CAB to _ _ _ RelAB SNA1 SNB M. Subgoal 2.2.1: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M : mems X1 Ctx1 H5 : mems X1 Ctx2 ============================ mems X1 Ctx2
< search. Subgoal 2.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 H5 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.3: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (declare Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 CtxB SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (declare Ty X1 E) NB CtxB' Mems : mems X ((X1::Scope)::Ctx) SNA1 : exprNames (Scope::Ctx) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.3: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 CtxB SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (declare Ty X1 E) NB CtxB' Mems : mems X ((X1::Scope)::Ctx) SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.3: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ Mems : mems X ((X1::Scope)::Ctx) SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X ((X1::Scope1)::Ctx1)
< Mems: case Mems. Subgoal 2.3.1: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mem X (X1::Scope) ============================ mems X ((X1::Scope1)::Ctx1)
< M: case Mems. Subgoal 2.3.1.1: Variables: NA NB Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X1 ((X1::Scope1)::Ctx1)
< search. Subgoal 2.3.1.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope ============================ mems X ((X1::Scope1)::Ctx1)
< M': apply RelAB to _ with X1 = X. Subgoal 2.3.1.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope M' : mems X (Scope1::Ctx1) ============================ mems X ((X1::Scope1)::Ctx1)
< case M'. Subgoal 2.3.1.2.1: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope H4 : mem X Scope1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.3.1.2.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope H4 : mems X Ctx1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.3.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx ============================ mems X ((X1::Scope1)::Ctx1)
< M': apply RelAB to _ with X1 = X. Subgoal 2.3.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx M' : mems X (Scope1::Ctx1) ============================ mems X ((X1::Scope1)::Ctx1)
< case M'. Subgoal 2.3.2.1: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx H4 : mem X Scope1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.3.2.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx H4 : mems X Ctx1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.4: Variables: NA CtxA' CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxA' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * ============================ mems X CtxB'
< Is: case IsS. Subgoal 2.4: Variables: NA CtxA' CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxA' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.4.1: Variables: NA CtxA' NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.4.1: Variables: NA CtxA' NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB H1 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.4.2: Variables: NA CtxA' CtxB' X E X1 N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N ============================ mems X CtxB'
< M: apply RelAB to SNA1. Subgoal 2.4.2: Variables: NA CtxA' CtxB' X E X1 N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N M : mems X1 CtxB' ============================ mems X CtxB'
< apply not_mems to SNB M. Subgoal 2.5: Variables: CtxA' CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxA' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * ============================ mems X CtxB'
< Is: case IsS. Subgoal 2.5: Variables: CtxA' CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxA' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.5.1: Variables: CtxA' NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.5.1: Variables: CtxA' NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB H1 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.5.2: Variables: CtxA' CtxB' X N X1 E N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N1 ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.5.2: Variables: CtxA' CtxB' X N X1 E N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N1 H1 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.6: Variables: NA CtxA' CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxA' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.6: Variables: NA CtxA' CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxA' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.6.1: Variables: NA CtxA' NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.6.1: Variables: NA CtxA' NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB H4 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.6.2: Variables: NA CtxA' CtxB' X E Fields R N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.6.2: Variables: NA CtxA' CtxB' X E Fields R N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N H4 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.7: Variables: CtxA' CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxA' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * ============================ mems X CtxB'
< case IsS. Subgoal 2.7: Variables: CtxA' CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxA' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.7.1: Variables: CtxA' NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.7.1: Variables: CtxA' NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB H4 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.7.2: Variables: CtxA' CtxB' X N R E Fields N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N1 ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.7.2: Variables: CtxA' CtxB' X N R E Fields N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N1 H4 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.8: Variables: NA CtxA' CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ SNB : stmtNames CtxB (ifThenElse C T F) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.8: Variables: NA CtxA' CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ SNB : stmtNames CtxB (ifThenElse C T F) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ mems X CtxB'
< case SNB. Subgoal 2.8: Variables: NA CtxA' NB CtxB' X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : exprNames CtxB' C CN1 H5 : stmtNames ([]::CtxB') T TN1 CtxT1 H6 : stmtNames ([]::CtxB') F FN1 CtxF1 H7 : CN1 ++ TN1 = N2 H8 : N2 ++ FN1 = NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.8: Variables: NA CtxA' NB CtxB' X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F H4 : exprNames CtxB' C CN1 H5 : stmtNames ([]::CtxB') T TN1 CtxT1 H6 : stmtNames ([]::CtxB') F FN1 CtxF1 H7 : CN1 ++ TN1 = N2 H8 : N2 ++ FN1 = NB H9 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.9: Variables: NA CtxA' CtxB NB CtxB' X CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (while Cond Body) NA CtxA' @ SNB : stmtNames CtxB (while Cond Body) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' Cond CN * SNA2 : stmtNames ([]::CtxA') Body BN CtxB1 * SNA3 : CN ++ BN = NA ============================ mems X CtxB'
< case SNB. Subgoal 2.9: Variables: NA CtxA' NB CtxB' X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (while Cond Body) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' Cond CN * SNA2 : stmtNames ([]::CtxA') Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : exprNames CtxB' Cond CN1 H2 : stmtNames ([]::CtxB') Body BN1 CtxB2 H3 : CN1 ++ BN1 = NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.9: Variables: NA CtxA' NB CtxB' X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (while Cond Body) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' Cond CN * SNA2 : stmtNames ([]::CtxA') Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : exprNames CtxB' Cond CN1 H2 : stmtNames ([]::CtxB') Body BN1 CtxB2 H3 : CN1 ++ BN1 = NB H4 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.10: Variables: NA CtxA' CtxB NB CtxB' X Ctx1 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (scopeStmt S1) NA CtxA' @ SNB : stmtNames CtxB (scopeStmt S1) NB CtxB' Mems : mems X CtxA' SNA1 : stmtNames ([]::CtxA') S1 NA Ctx1 * ============================ mems X CtxB'
< case SNB. Subgoal 2.10: Variables: NA CtxA' NB CtxB' X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (scopeStmt S1) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames ([]::CtxA') S1 NA Ctx1 * H1 : stmtNames ([]::CtxB') S1 NB Ctx2 ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.10: Variables: NA CtxA' NB CtxB' X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (scopeStmt S1) NA CtxA' @ Mems : mems X CtxA' SNA1 : stmtNames ([]::CtxA') S1 NA Ctx1 * H1 : stmtNames ([]::CtxB') S1 NB Ctx2 H2 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 2.11: Variables: NA CtxA' CtxB NB CtxB' X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (printVal E) NA CtxA' @ SNB : stmtNames CtxB (printVal E) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' E NA * ============================ mems X CtxB'
< case SNB. Subgoal 2.11: Variables: NA CtxA' NB CtxB' X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (printVal E) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' E NA * H1 : exprNames CtxB' E NB ============================ mems X CtxB'
< apply RelAB to Mems. Subgoal 2.11: Variables: NA CtxA' NB CtxB' X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (printVal E) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' E NA * H1 : exprNames CtxB' E NB H2 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 3.1: Variables: CtxA' CtxB NB CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' noop [] CtxA' @ SNB : stmtNames CtxB noop NB CtxB' Mems : mems X CtxB' ============================ mems X CtxA'
< case SNB. Subgoal 3.1: Variables: CtxA' CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' noop [] CtxA' @ Mems : mems X CtxB' ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.1: Variables: CtxA' CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt noop IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' noop [] CtxA' @ Mems : mems X CtxB' H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (seq S1 S2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ SNB : stmtNames CtxB (seq S1 S2) NB CtxB' Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA ============================ mems X CtxA'
< case IsS. Subgoal 3.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ SNB : stmtNames CtxB (seq S1 S2) NB CtxB' Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB ============================ mems X CtxA'
< apply stmtNames_isCtx to _ _ SNA1. Subgoal 3.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 ============================ mems X CtxA'
< apply stmtNames_isCtx to _ _ SNB. Subgoal 3.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 ============================ mems X CtxA'
< apply IH_S_CBA to _ _ _ _ SNA2 SNB1 Mems. Subgoal 3.2.1: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 ============================ forall X1, mems X1 Ctx2 -> mems X1 Ctx1
< intros M. Subgoal 3.2.1: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M : mems X1 Ctx2 ============================ mems X1 Ctx1
< apply IH_S_CBA to _ _ _ RelBA SNA1 SNB M. Subgoal 3.2.1: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M : mems X1 Ctx2 H5 : mems X1 Ctx1 ============================ mems X1 Ctx1
< search. Subgoal 3.2: Variables: CtxA NA CtxA' CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA SNA : stmtNames CtxA (seq S1 S2) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames CtxA S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames CtxB S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 H5 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.3: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (declare Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (declare Ty X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames (Scope::Ctx) E NA * ============================ mems X ((X1::Scope)::Ctx)
< case IsS. Subgoal 3.3: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (declare Ty X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E ============================ mems X ((X1::Scope)::Ctx)
< SNB: case SNB. Subgoal 3.3: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ Mems : mems X ((X1::Scope1)::Ctx1) SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X ((X1::Scope)::Ctx)
< Mems: case Mems. Subgoal 3.3.1: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mem X (X1::Scope1) ============================ mems X ((X1::Scope)::Ctx)
< M: case Mems. Subgoal 3.3.1.1: Variables: NA NB Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X1 ((X1::Scope)::Ctx)
< search. Subgoal 3.3.1.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 ============================ mems X ((X1::Scope)::Ctx)
< M': apply RelBA to _ with X1 = X. Subgoal 3.3.1.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 M' : mems X (Scope::Ctx) ============================ mems X ((X1::Scope)::Ctx)
< case M'. Subgoal 3.3.1.2.1: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 H4 : mem X Scope ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.3.1.2.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 H4 : mems X Ctx ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.3.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx1 ============================ mems X ((X1::Scope)::Ctx)
< M': apply RelBA to _ with X1 = X. Subgoal 3.3.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx1 M' : mems X (Scope::Ctx) ============================ mems X ((X1::Scope)::Ctx)
< case M'. Subgoal 3.3.2.1: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx1 H4 : mem X Scope ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.3.2.2: Variables: NA NB X Ctx Scope X1 E Ty Ctx1 Scope1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (declare Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB Mems : mems X Ctx1 H4 : mems X Ctx ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.4: Variables: NA CtxA' CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * ============================ mems X CtxA'
< Is: case IsS. Subgoal 3.4: Variables: NA CtxA' CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.4.1: Variables: NA CtxA' NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.4.1: Variables: NA CtxA' NB CtxB' X E X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.4.2: Variables: NA CtxA' CtxB' X E X1 N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.4.2: Variables: NA CtxA' CtxB' X E X1 N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems X1 CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.5: Variables: CtxA' CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * ============================ mems X CtxA'
< Is: case IsS. Subgoal 3.5: Variables: CtxA' CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ SNB : stmtNames CtxB (assign X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.5.1: Variables: CtxA' NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.5.1: Variables: CtxA' NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : mems X1 CtxB' SNB1 : exprNames CtxB' E NB H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.5.2: Variables: CtxA' CtxB' X N X1 E N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N1 ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.5.2: Variables: CtxA' CtxB' X N X1 E N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assign X1 E) (X1::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems X1 CtxA' SNA2 : exprNames CtxA' E N * Is : is_string X1 Is1 : is_expr E SNB : not_mems X1 CtxB' SNB1 : exprNames CtxB' E N1 H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.6: Variables: NA CtxA' CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxB' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * ============================ mems X CtxA'
< Is: case IsS. Subgoal 3.6: Variables: NA CtxA' CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxB' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.6.1: Variables: NA CtxA' NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.6.1: Variables: NA CtxA' NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.6.2: Variables: NA CtxA' CtxB' X E Fields R N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.6.2: Variables: NA CtxA' CtxB' X E Fields R N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems R CtxA' SNA2 : exprNames CtxA' E NA * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.7: Variables: CtxA' CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxB' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * ============================ mems X CtxA'
< Is: case IsS. Subgoal 3.7: Variables: CtxA' CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ SNB : stmtNames CtxB (recUpdate R Fields E) NB CtxB' Mems : mems X CtxB' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.7.1: Variables: CtxA' NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.7.1: Variables: CtxA' NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : mems R CtxB' SNB1 : exprNames CtxB' E NB H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.7.2: Variables: CtxA' CtxB' X N R E Fields N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N1 ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.7.2: Variables: CtxA' CtxB' X N R E Fields N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (recUpdate R Fields E) (R::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems R CtxA' SNA2 : exprNames CtxA' E N * Is : is_string R Is1 : is_list is_string Fields Is2 : is_expr E SNB : not_mems R CtxB' SNB1 : exprNames CtxB' E N1 H1 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.8: Variables: NA CtxA' CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ SNB : stmtNames CtxB (ifThenElse C T F) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA ============================ mems X CtxA'
< case SNB. Subgoal 3.8: Variables: NA CtxA' NB CtxB' X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : exprNames CtxB' C CN1 H2 : stmtNames ([]::CtxB') T TN1 CtxT1 H3 : stmtNames ([]::CtxB') F FN1 CtxF1 H4 : CN1 ++ TN1 = N2 H5 : N2 ++ FN1 = NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.8: Variables: NA CtxA' NB CtxB' X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (ifThenElse C T F) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' C CN * SNA2 : stmtNames ([]::CtxA') T TN CtxT * SNA3 : stmtNames ([]::CtxA') F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : exprNames CtxB' C CN1 H2 : stmtNames ([]::CtxB') T TN1 CtxT1 H3 : stmtNames ([]::CtxB') F FN1 CtxF1 H4 : CN1 ++ TN1 = N2 H5 : N2 ++ FN1 = NB H6 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.9: Variables: NA CtxA' CtxB NB CtxB' X CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (while Cond Body) NA CtxA' @ SNB : stmtNames CtxB (while Cond Body) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames CtxA' Cond CN * SNA2 : stmtNames ([]::CtxA') Body BN CtxB1 * SNA3 : CN ++ BN = NA ============================ mems X CtxA'
< case SNB. Subgoal 3.9: Variables: NA CtxA' NB CtxB' X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (while Cond Body) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' Cond CN * SNA2 : stmtNames ([]::CtxA') Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : exprNames CtxB' Cond CN1 H2 : stmtNames ([]::CtxB') Body BN1 CtxB2 H3 : CN1 ++ BN1 = NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.9: Variables: NA CtxA' NB CtxB' X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (while Cond Body) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' Cond CN * SNA2 : stmtNames ([]::CtxA') Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : exprNames CtxB' Cond CN1 H2 : stmtNames ([]::CtxB') Body BN1 CtxB2 H3 : CN1 ++ BN1 = NB H4 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.10: Variables: NA CtxA' CtxB NB CtxB' X Ctx1 S1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (scopeStmt S1) NA CtxA' @ SNB : stmtNames CtxB (scopeStmt S1) NB CtxB' Mems : mems X CtxB' SNA1 : stmtNames ([]::CtxA') S1 NA Ctx1 * ============================ mems X CtxA'
< case SNB. Subgoal 3.10: Variables: NA CtxA' NB CtxB' X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (scopeStmt S1) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames ([]::CtxA') S1 NA Ctx1 * H1 : stmtNames ([]::CtxB') S1 NB Ctx2 ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.10: Variables: NA CtxA' NB CtxB' X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (scopeStmt S1) NA CtxA' @ Mems : mems X CtxB' SNA1 : stmtNames ([]::CtxA') S1 NA Ctx1 * H1 : stmtNames ([]::CtxB') S1 NB Ctx2 H2 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 3.11: Variables: NA CtxA' CtxB NB CtxB' X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (printVal E) NA CtxA' @ SNB : stmtNames CtxB (printVal E) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames CtxA' E NA * ============================ mems X CtxA'
< case SNB. Subgoal 3.11: Variables: NA CtxA' NB CtxB' X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (printVal E) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' E NA * H1 : exprNames CtxB' E NB ============================ mems X CtxA'
< apply RelBA to Mems. Subgoal 3.11: Variables: NA CtxA' NB CtxB' X E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (printVal E) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' E NA * H1 : exprNames CtxB' E NB H2 : mems X CtxA' ============================ mems X CtxA'
< search. Subgoal 4.1: Variables: CtxA CtxB I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (num I) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (num I) [] @ ============================ exprNames CtxB (num I) []
< search. Subgoal 4.2: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (plus E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (plus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (plus E1 E2) N
< case IsE. Subgoal 4.2: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (plus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (plus E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.2: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (plus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (plus E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.2: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (plus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (plus E1 E2) N
< search. Subgoal 4.3: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (minus E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (minus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (minus E1 E2) N
< case IsE. Subgoal 4.3: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (minus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (minus E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.3: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (minus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (minus E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.3: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (minus E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (minus E1 E2) N
< search. Subgoal 4.4: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (mult E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (mult E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (mult E1 E2) N
< case IsE. Subgoal 4.4: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (mult E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (mult E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.4: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (mult E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (mult E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.4: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (mult E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (mult E1 E2) N
< search. Subgoal 4.5: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (div E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (div E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (div E1 E2) N
< case IsE. Subgoal 4.5: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (div E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (div E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.5: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (div E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (div E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.5: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (div E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (div E1 E2) N
< search. Subgoal 4.6: Variables: CtxA CtxB IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr true IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA true [] @ ============================ exprNames CtxB true []
< search. Subgoal 4.7: Variables: CtxA CtxB IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr false IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA false [] @ ============================ exprNames CtxB false []
< search. Subgoal 4.8: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (and E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (and E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (and E1 E2) N
< case IsE. Subgoal 4.8: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (and E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (and E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.8: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (and E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (and E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.8: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (and E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (and E1 E2) N
< search. Subgoal 4.9: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (or E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (or E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (or E1 E2) N
< case IsE. Subgoal 4.9: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (or E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (or E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.9: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (or E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (or E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.9: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (or E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (or E1 E2) N
< search. Subgoal 4.10: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (not E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (not E1) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (not E1) N
< case IsE. Subgoal 4.10: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (not E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 ============================ exprNames CtxB (not E1) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.10: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (not E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : exprNames CtxB E1 N ============================ exprNames CtxB (not E1) N
< search. Subgoal 4.11: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (greater E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (greater E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (greater E1 E2) N
< case IsE. Subgoal 4.11: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (greater E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (greater E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.11: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (greater E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (greater E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.11: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (greater E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (greater E1 E2) N
< search. Subgoal 4.12: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (eq E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (eq E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (eq E1 E2) N
< case IsE. Subgoal 4.12: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (eq E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (eq E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.12: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (eq E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (eq E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.12: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (eq E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (eq E1 E2) N
< search. Subgoal 4.13: Variables: CtxA CtxB S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (stringLit S) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stringLit S) [] @ ============================ exprNames CtxB (stringLit S) []
< search. Subgoal 4.14: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (appString E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (appString E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (appString E1 E2) N
< case IsE. Subgoal 4.14: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (appString E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (appString E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.14: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (appString E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (appString E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.14: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (appString E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (appString E1 E2) N
< search. Subgoal 4.15: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (name X) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [] @ EN1 : mems X CtxA ============================ exprNames CtxB (name X) []
< IsX: case IsE. Subgoal 4.15: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [] @ EN1 : mems X CtxA IsX : is_string X ============================ exprNames CtxB (name X) []
< apply RelAB to EN1. Subgoal 4.15: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [] @ EN1 : mems X CtxA IsX : is_string X H1 : mems X CtxB ============================ exprNames CtxB (name X) []
< search. Subgoal 4.16: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (name X) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [X] @ EN1 : not_mems X CtxA ============================ exprNames CtxB (name X) [X]
< IsX: case IsE. Subgoal 4.16: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [X] @ EN1 : not_mems X CtxA IsX : is_string X ============================ exprNames CtxB (name X) [X]
< Or: apply mems_or_not_mems to IsCtxB IsX. Subgoal 4.16: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [X] @ EN1 : not_mems X CtxA IsX : is_string X Or : mems X CtxB \/ not_mems X CtxB ============================ exprNames CtxB (name X) [X]
< M: case Or. Subgoal 4.16.1: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [X] @ EN1 : not_mems X CtxA IsX : is_string X M : mems X CtxB ============================ exprNames CtxB (name X) [X]
< M': apply RelBA to M. Subgoal 4.16.1: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [X] @ EN1 : not_mems X CtxA IsX : is_string X M : mems X CtxB M' : mems X CtxA ============================ exprNames CtxB (name X) [X]
< apply not_mems to EN1 M'. Subgoal 4.16.2: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (name X) [X] @ EN1 : not_mems X CtxA IsX : is_string X M : not_mems X CtxB ============================ exprNames CtxB (name X) [X]
< search. Subgoal 4.17: Variables: CtxA CtxB N Args F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (call F Args) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (call F Args) N @ EN1 : argsNames CtxA Args N * ============================ exprNames CtxB (call F Args) N
< case IsE. Subgoal 4.17: Variables: CtxA CtxB N Args F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (call F Args) N @ EN1 : argsNames CtxA Args N * H1 : is_string F H2 : is_args Args ============================ exprNames CtxB (call F Args) N
< apply IH_A to _ _ _ RelAB RelBA EN1. Subgoal 4.17: Variables: CtxA CtxB N Args F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (call F Args) N @ EN1 : argsNames CtxA Args N * H1 : is_string F H2 : is_args Args H3 : argsNames CtxB Args N ============================ exprNames CtxB (call F Args) N
< search. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (stmtExpr S E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N ============================ exprNames CtxB (stmtExpr S E1) N
< case IsE. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 ============================ exprNames CtxB (stmtExpr S E1) N
< apply stmtNames_isCtx to _ _ EN1. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS ============================ exprNames CtxB (stmtExpr S E1) N
< assert forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA). Subgoal 4.18.1: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS ============================ forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA)
< intros M. Subgoal 4.18.1: Variables: CtxA CtxB N NS CtxS NE E1 S X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS M : mems X1 ([]::CtxB) ============================ mems X1 ([]::CtxA)
< M: case M. Subgoal 4.18.1.1: Variables: CtxA CtxB N NS CtxS NE E1 S X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS M : mem X1 [] ============================ mems X1 ([]::CtxA)
< case M. Subgoal 4.18.1.2: Variables: CtxA CtxB N NS CtxS NE E1 S X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS M : mems X1 CtxB ============================ mems X1 ([]::CtxA)
< apply RelBA to M. Subgoal 4.18.1.2: Variables: CtxA CtxB N NS CtxS NE E1 S X1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS M : mems X1 CtxB H4 : mems X1 CtxA ============================ mems X1 ([]::CtxA)
< search. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) ============================ exprNames CtxB (stmtExpr S E1) N
< assert forall X, mems X ([]::CtxA) -> mems X ([]::CtxB). Subgoal 4.18.2: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) ============================ forall X, mems X ([]::CtxA) -> mems X ([]::CtxB)
< intros M. Subgoal 4.18.2: Variables: CtxA CtxB N NS CtxS NE E1 S X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) M : mems X ([]::CtxA) ============================ mems X ([]::CtxB)
< M: case M. Subgoal 4.18.2.1: Variables: CtxA CtxB N NS CtxS NE E1 S X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) M : mem X [] ============================ mems X ([]::CtxB)
< case M. Subgoal 4.18.2.2: Variables: CtxA CtxB N NS CtxS NE E1 S X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) M : mems X CtxA ============================ mems X ([]::CtxB)
< apply RelAB to M. Subgoal 4.18.2.2: Variables: CtxA CtxB N NS CtxS NE E1 S X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) M : mems X CtxA H5 : mems X CtxB ============================ mems X ([]::CtxB)
< search. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) ============================ exprNames CtxB (stmtExpr S E1) N
< B1: apply IH_S to _ _ _ _ _ EN1 with ScopeB = [] CtxB = CtxB. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' ============================ exprNames CtxB (stmtExpr S E1) N
< apply stmtNames_isCtx to _ _ B1. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' ============================ exprNames CtxB (stmtExpr S E1) N
< apply IH_E to _ _ _ _ _ EN2 with CtxB = CtxB'. Subgoal 4.18.3: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' ============================ forall X, mems X CtxB' -> mems X CtxS
< intros M. Subgoal 4.18.3: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' M : mems X CtxB' ============================ mems X CtxS
< apply IH_S_CBA to _ _ _ _ EN1 B1 M. Subgoal 4.18.3: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' M : mems X CtxB' H7 : mems X CtxS ============================ mems X CtxS
< search. Subgoal 4.18.4: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' ============================ forall X, mems X CtxS -> mems X CtxB'
< intros M. Subgoal 4.18.4: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' M : mems X CtxS ============================ mems X CtxB'
< apply IH_S_CAB to _ _ _ _ EN1 B1 M. Subgoal 4.18.4: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' M : mems X CtxS H7 : mems X CtxB' ============================ mems X CtxB'
< search. Subgoal 4.18: Variables: CtxA CtxB N NS CtxS NE E1 S CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (stmtExpr S E1) N @ EN1 : stmtNames ([]::CtxA) S NS CtxS * EN2 : exprNames CtxS E1 NE * EN3 : NS ++ NE = N H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list is_string) CtxS H4 : forall X1, mems X1 ([]::CtxB) -> mems X1 ([]::CtxA) H5 : forall X, mems X ([]::CtxA) -> mems X ([]::CtxB) B1 : stmtNames ([]::CtxB) S NS CtxB' H6 : is_list (is_list is_string) CtxB' H7 : exprNames CtxB' E1 NE ============================ exprNames CtxB (stmtExpr S E1) N
< search. Subgoal 4.19: Variables: CtxA CtxB N RF IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (recBuild RF) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (recBuild RF) N @ EN1 : recFieldNames CtxA RF N * ============================ exprNames CtxB (recBuild RF) N
< case IsE. Subgoal 4.19: Variables: CtxA CtxB N RF IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (recBuild RF) N @ EN1 : recFieldNames CtxA RF N * H1 : is_recFieldExprs RF ============================ exprNames CtxB (recBuild RF) N
< apply IH_RF to _ _ _ RelAB RelBA EN1. Subgoal 4.19: Variables: CtxA CtxB N RF IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (recBuild RF) N @ EN1 : recFieldNames CtxA RF N * H1 : is_recFieldExprs RF H2 : recFieldNames CtxB RF N ============================ exprNames CtxB (recBuild RF) N
< search. Subgoal 4.20: Variables: CtxA CtxB N F E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (recFieldAccess E1 F) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (recFieldAccess E1 F) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (recFieldAccess E1 F) N
< case IsE. Subgoal 4.20: Variables: CtxA CtxB N F E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (recFieldAccess E1 F) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : is_string F ============================ exprNames CtxB (recFieldAccess E1 F) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.20: Variables: CtxA CtxB N F E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (recFieldAccess E1 F) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : is_string F H3 : exprNames CtxB E1 N ============================ exprNames CtxB (recFieldAccess E1 F) N
< search. Subgoal 4.21: Variables: CtxA CtxB N Ty E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (errorExpr E1 Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (errorExpr E1 Ty) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (errorExpr E1 Ty) N
< case IsE. Subgoal 4.21: Variables: CtxA CtxB N Ty E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (errorExpr E1 Ty) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : is_typ Ty ============================ exprNames CtxB (errorExpr E1 Ty) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.21: Variables: CtxA CtxB N Ty E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (errorExpr E1 Ty) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : is_typ Ty H3 : exprNames CtxB E1 N ============================ exprNames CtxB (errorExpr E1 Ty) N
< search. Subgoal 5: Variables: CtxA CtxB A N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsA : is_args A IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA AN : argsNames CtxA A N @ ============================ argsNames CtxB A N
< AN: case AN (keep). Subgoal 5.1: Variables: CtxA CtxB IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsA : is_args nilArgs IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA AN : argsNames CtxA nilArgs [] @ ============================ argsNames CtxB nilArgs []
< search. Subgoal 5.2: Variables: CtxA CtxB N EN AN A1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsA : is_args (consArgs E A1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA AN : argsNames CtxA (consArgs E A1) N @ AN1 : exprNames CtxA E EN * AN2 : argsNames CtxA A1 AN * AN3 : EN ++ AN = N ============================ argsNames CtxB (consArgs E A1) N
< case IsA. Subgoal 5.2: Variables: CtxA CtxB N EN AN A1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA AN : argsNames CtxA (consArgs E A1) N @ AN1 : exprNames CtxA E EN * AN2 : argsNames CtxA A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 ============================ argsNames CtxB (consArgs E A1) N
< apply IH_E to _ _ _ RelAB RelBA AN1. Subgoal 5.2: Variables: CtxA CtxB N EN AN A1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA AN : argsNames CtxA (consArgs E A1) N @ AN1 : exprNames CtxA E EN * AN2 : argsNames CtxA A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 H3 : exprNames CtxB E EN ============================ argsNames CtxB (consArgs E A1) N
< apply IH_A to _ _ _ RelAB RelBA AN2. Subgoal 5.2: Variables: CtxA CtxB N EN AN A1 E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA AN : argsNames CtxA (consArgs E A1) N @ AN1 : exprNames CtxA E EN * AN2 : argsNames CtxA A1 AN * AN3 : EN ++ AN = N H1 : is_expr E H2 : is_args A1 H3 : exprNames CtxB E EN H4 : argsNames CtxB A1 AN ============================ argsNames CtxB (consArgs E A1) N
< search. Subgoal 6: Variables: CtxA CtxB RF N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsRF : is_recFieldExprs RF IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA RFN : recFieldNames CtxA RF N @ ============================ recFieldNames CtxB RF N
< RFN: case RFN (keep). Subgoal 6.1: Variables: CtxA CtxB IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsRF : is_recFieldExprs nilRecFieldExprs IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA RFN : recFieldNames CtxA nilRecFieldExprs [] @ ============================ recFieldNames CtxB nilRecFieldExprs []
< search. Subgoal 6.2: Variables: CtxA CtxB N EN RN RF1 E F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA RFN : recFieldNames CtxA (consRecFieldExprs F E RF1) N @ RFN1 : exprNames CtxA E EN * RFN2 : recFieldNames CtxA RF1 RN * RFN3 : EN ++ RN = N ============================ recFieldNames CtxB (consRecFieldExprs F E RF1) N
< case IsRF. Subgoal 6.2: Variables: CtxA CtxB N EN RN RF1 E F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA RFN : recFieldNames CtxA (consRecFieldExprs F E RF1) N @ RFN1 : exprNames CtxA E EN * RFN2 : recFieldNames CtxA RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ recFieldNames CtxB (consRecFieldExprs F E RF1) N
< apply IH_E to _ _ _ RelAB RelBA RFN1. Subgoal 6.2: Variables: CtxA CtxB N EN RN RF1 E F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA RFN : recFieldNames CtxA (consRecFieldExprs F E RF1) N @ RFN1 : exprNames CtxA E EN * RFN2 : recFieldNames CtxA RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : exprNames CtxB E EN ============================ recFieldNames CtxB (consRecFieldExprs F E RF1) N
< apply IH_RF to _ _ _ RelAB RelBA RFN2. Subgoal 6.2: Variables: CtxA CtxB N EN RN RF1 E F IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA RFN : recFieldNames CtxA (consRecFieldExprs F E RF1) N @ RFN1 : exprNames CtxA E EN * RFN2 : recFieldNames CtxA RF1 RN * RFN3 : EN ++ RN = N H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : exprNames CtxB E EN H5 : recFieldNames CtxB RF1 RN ============================ recFieldNames CtxB (consRecFieldExprs F E RF1) N
< search. Proof completed.
< Extensible_Theorem stmtNames_increaseCtxs : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, IsS : is_stmt S -> IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) -> IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) -> RelAB : (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> SNA : stmtNames (ScopeA::CtxA) S NA CtxA' -> SNB : stmtNames (ScopeB::CtxB) S NB CtxB' -> M : mem X NB -> mem X NA on SNA as IH_S, stmtNames_increaseCtxs_ctxs : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, IsS : is_stmt S -> IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) -> IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) -> RelAB : (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> SNA : stmtNames (ScopeA::CtxA) S NA CtxA' -> SNB : stmtNames (ScopeB::CtxB) S NB CtxB' -> M : mems X CtxA' -> mems X CtxB' on SNA as IH_S_C, exprNames_increaseCtxs : forall CtxA E NA CtxB NB X, IsE : is_expr E -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> ENA : exprNames CtxA E NA -> ENB : exprNames CtxB E NB -> M : mem X NB -> mem X NA on ENA as IH_Ealso argsNames_increaseCtxs : forall CtxA A NA CtxB NB X, IsA : is_args A -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> ANA : argsNames CtxA A NA -> ANB : argsNames CtxB A NB -> M : mem X NB -> mem X NA on ANA as IH_A, recFieldNames_increaseCtxs : forall CtxA RF NA CtxB NB X, IsRF : is_recFieldExprs RF -> IsCtxA : is_list (is_list is_string) CtxA -> IsCtxB : is_list (is_list is_string) CtxB -> RelAB : (forall X, mems X CtxA -> mems X CtxB) -> RFNA : recFieldNames CtxA RF NA -> RFNB : recFieldNames CtxB RF NB -> M : mem X NB -> mem X NA on RFNA as IH_RF. Subgoal 1.1: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt noop IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) noop [] (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) noop NB CtxB' M : mem X NB ============================ mem X []
< case SNB. Subgoal 1.1: Variables: ScopeA CtxA ScopeB CtxB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt noop IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) noop [] (ScopeA::CtxA) @ M : mem X [] ============================ mem X []
< case M. Subgoal 1.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (seq S1 S2) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ SNB : stmtNames (ScopeB::CtxB) (seq S1 S2) NB CtxB' M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsS. Subgoal 1.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ SNB : stmtNames (ScopeB::CtxB) (seq S1 S2) NB CtxB' M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 ============================ mem X NA
< SNB: case SNB. Subgoal 1.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB ============================ mem X NA
< apply stmtNames_isCtx to _ _ SNA1. Subgoal 1.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 ============================ mem X NA
< apply stmtNames_isCtx to _ _ SNB. Subgoal 1.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 ============================ mem X NA
< Or: apply mem_append to M SNB2. Subgoal 1.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 1.2.1: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M' : mem X N3 ============================ mem X NA
< MA: apply IH_S to _ _ _ _ SNA1 SNB M'. Subgoal 1.2.1: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M' : mem X N3 MA : mem X N1 ============================ mem X NA
< apply mem_append_left to MA SNA3. Subgoal 1.2.1: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M' : mem X N3 MA : mem X N1 H5 : mem X NA ============================ mem X NA
< search. Subgoal 1.2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) Ctx2 M' : mem X N4 ============================ mem X NA
< apply stmtNames_keep_older to _ _ SNB. Subgoal 1.2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 N4 Scope' IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) Ctx1 H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' ============================ mem X NA
< apply stmtNames_keep_older to _ _ SNA1. Subgoal 1.2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'1::CtxA) * SNA2 : stmtNames (Scope'1::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) (Scope'1::CtxA) H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' H6 : forall X, mem X ScopeA -> mem X Scope'1 ============================ mem X NA
< MA: apply IH_S to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.2.2.1: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'1::CtxA) * SNA2 : stmtNames (Scope'1::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) (Scope'1::CtxA) H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' H6 : forall X, mem X ScopeA -> mem X Scope'1 ============================ forall X1, mems X1 (Scope'1::CtxA) -> mems X1 (Scope'::CtxB)
< intros MA+. Subgoal 1.2.2.1: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'1::CtxA) * SNA2 : stmtNames (Scope'1::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) (Scope'1::CtxA) H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' H6 : forall X, mem X ScopeA -> mem X Scope'1 MA+ : mems X1 (Scope'1::CtxA) ============================ mems X1 (Scope'::CtxB)
< apply IH_S_C to _ _ _ _ SNA1 SNB MA+. Subgoal 1.2.2.1: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'1::CtxA) * SNA2 : stmtNames (Scope'1::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) (Scope'1::CtxA) H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' H6 : forall X, mem X ScopeA -> mem X Scope'1 MA+ : mems X1 (Scope'1::CtxA) H7 : mems X1 (Scope'::CtxB) ============================ mems X1 (Scope'::CtxB)
< search. Subgoal 1.2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'1::CtxA) * SNA2 : stmtNames (Scope'1::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) (Scope'1::CtxA) H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' H6 : forall X, mem X ScopeA -> mem X Scope'1 MA : mem X N2 ============================ mem X NA
< apply mem_append_right to MA SNA3. Subgoal 1.2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mem X NB SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'1::CtxA) * SNA2 : stmtNames (Scope'1::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'::CtxB) SNB1 : stmtNames (Scope'::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB H3 : is_list (is_list is_string) (Scope'1::CtxA) H4 : is_list (is_list is_string) (Scope'::CtxB) M' : mem X N4 H5 : forall X, mem X ScopeB -> mem X Scope' H6 : forall X, mem X ScopeA -> mem X Scope'1 MA : mem X N2 H7 : mem X NA ============================ mem X NA
< search. Subgoal 1.3: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (declare Ty X1 E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (declare Ty X1 E) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * ============================ mem X NA
< case IsS. Subgoal 1.3: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (declare Ty X1 E) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E ============================ mem X NA
< SNB: case SNB. Subgoal 1.3: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mem X NA
< apply IH_E to _ _ _ _ SNA1 SNB M. Subgoal 1.3: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.4: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mem X NB SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * ============================ mem X NA
< case IsS. Subgoal 1.4: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mem X NB SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E ============================ mem X NA
< SNB: case SNB. Subgoal 1.4.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mem X NA
< apply IH_E to _ _ _ _ SNA2 SNB1 M. Subgoal 1.4.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H3 : mem X NA ============================ mem X NA
< search. Subgoal 1.4.2: Variables: ScopeA CtxA NA ScopeB CtxB X E X1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mem X (X1::N) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N ============================ mem X NA
< MB: apply RelAB to SNA1. Subgoal 1.4.2: Variables: ScopeA CtxA NA ScopeB CtxB X E X1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mem X (X1::N) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N MB : mems X1 (ScopeB::CtxB) ============================ mem X NA
< apply not_mems to SNB MB. Subgoal 1.5: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mem X NB SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * ============================ mem X (X1::N)
< case IsS. Subgoal 1.5: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mem X NB SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E ============================ mem X (X1::N)
< SNB: case SNB. Subgoal 1.5.1: Variables: ScopeA CtxA ScopeB CtxB NB X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mem X (X1::N)
< apply IH_E to _ _ _ _ SNA2 SNB1 M. Subgoal 1.5.1: Variables: ScopeA CtxA ScopeB CtxB NB X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H3 : mem X N ============================ mem X (X1::N)
< search. Subgoal 1.5.2: Variables: ScopeA CtxA ScopeB CtxB X N X1 E N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mem X (X1::N1) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 ============================ mem X (X1::N)
< M: case M. Subgoal 1.5.2.1: Variables: ScopeA CtxA ScopeB CtxB N X1 E N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 ============================ mem X1 (X1::N)
< search. Subgoal 1.5.2.2: Variables: ScopeA CtxA ScopeB CtxB X N X1 E N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 M : mem X N1 ============================ mem X (X1::N)
< apply IH_E to _ _ _ _ SNA2 SNB1 M. Subgoal 1.5.2.2: Variables: ScopeA CtxA ScopeB CtxB X N X1 E N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 M : mem X N1 H3 : mem X N ============================ mem X (X1::N)
< search. Subgoal 1.6: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mem X NB SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * ============================ mem X NA
< case IsS. Subgoal 1.6: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mem X NB SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ mem X NA
< SNB: case SNB. Subgoal 1.6.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mem X NA
< apply IH_E to _ _ _ _ SNA2 SNB1 M. Subgoal 1.6.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.6.2: Variables: ScopeA CtxA NA ScopeB CtxB X E Fields R N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mem X (R::N) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N ============================ mem X NA
< MB: apply RelAB to SNA1. Subgoal 1.6.2: Variables: ScopeA CtxA NA ScopeB CtxB X E Fields R N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mem X (R::N) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N MB : mems R (ScopeB::CtxB) ============================ mem X NA
< apply not_mems to SNB MB. Subgoal 1.7: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mem X NB SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * ============================ mem X (R::N)
< case IsS. Subgoal 1.7: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mem X NB SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ mem X (R::N)
< SNB: case SNB. Subgoal 1.7.1: Variables: ScopeA CtxA ScopeB CtxB NB X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mem X (R::N)
< apply IH_E to _ _ _ _ SNA2 SNB1 M. Subgoal 1.7.1: Variables: ScopeA CtxA ScopeB CtxB NB X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H4 : mem X N ============================ mem X (R::N)
< search. Subgoal 1.7.2: Variables: ScopeA CtxA ScopeB CtxB X N R E Fields N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mem X (R::N1) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 ============================ mem X (R::N)
< M: case M. Subgoal 1.7.2.1: Variables: ScopeA CtxA ScopeB CtxB N R E Fields N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 ============================ mem R (R::N)
< search. Subgoal 1.7.2.2: Variables: ScopeA CtxA ScopeB CtxB X N R E Fields N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 M : mem X N1 ============================ mem X (R::N)
< apply IH_E to _ _ _ _ SNA2 SNB1 M. Subgoal 1.7.2.2: Variables: ScopeA CtxA ScopeB CtxB X N R E Fields N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 M : mem X N1 H4 : mem X N ============================ mem X (R::N)
< search. Subgoal 1.8: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (ifThenElse C T F) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA ============================ mem X NA
< case IsS. Subgoal 1.8: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (ifThenElse C T F) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ mem X NA
< SNB: case SNB. Subgoal 1.8: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ mem X NA
< Or: apply mem_append to M SNB4. Subgoal 1.8: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB Or : mem X N2 \/ mem X FN1 ============================ mem X NA
< M': case Or. Subgoal 1.8.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 ============================ mem X NA
< Or: apply mem_append to M' SNB3. Subgoal 1.8.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 Or : mem X CN1 \/ mem X TN1 ============================ mem X NA
< M'': case Or. Subgoal 1.8.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 ============================ mem X NA
< MC: apply IH_E to _ _ _ _ SNA1 SNB M''. Subgoal 1.8.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 MC : mem X CN ============================ mem X NA
< M1: apply mem_append_left to MC SNA4. Subgoal 1.8.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 MC : mem X CN M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 SNA5. Subgoal 1.8.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 MC : mem X CN M1 : mem X N1 H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.8.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 ============================ mem X NA
< MT: apply IH_S to _ _ _ _ SNA2 SNB1 M''. Subgoal 1.8.1.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 ============================ forall X1, mems X1 ([]::(ScopeA::CtxA)) -> mems X1 ([]::(ScopeB::CtxB))
< intros Ms. Subgoal 1.8.1.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 Ms : mems X1 ([]::(ScopeA::CtxA)) ============================ mems X1 ([]::(ScopeB::CtxB))
< Ms: case Ms. Subgoal 1.8.1.2.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 Ms : mem X1 [] ============================ mems X1 ([]::(ScopeB::CtxB))
< case Ms. Subgoal 1.8.1.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 Ms : mems X1 (ScopeA::CtxA) ============================ mems X1 ([]::(ScopeB::CtxB))
< apply RelAB to Ms. Subgoal 1.8.1.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 Ms : mems X1 (ScopeA::CtxA) H4 : mems X1 (ScopeB::CtxB) ============================ mems X1 ([]::(ScopeB::CtxB))
< search. Subgoal 1.8.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 MT : mem X TN ============================ mem X NA
< M1: apply mem_append_right to MT SNA4. Subgoal 1.8.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 MT : mem X TN M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 SNA5. Subgoal 1.8.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 MT : mem X TN M1 : mem X N1 H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.8.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 ============================ mem X NA
< MF: apply IH_S to _ _ _ _ SNA3 SNB2 M'. Subgoal 1.8.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 ============================ forall X1, mems X1 ([]::(ScopeA::CtxA)) -> mems X1 ([]::(ScopeB::CtxB))
< intros Ms. Subgoal 1.8.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 Ms : mems X1 ([]::(ScopeA::CtxA)) ============================ mems X1 ([]::(ScopeB::CtxB))
< Ms: case Ms. Subgoal 1.8.2.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 Ms : mem X1 [] ============================ mems X1 ([]::(ScopeB::CtxB))
< case Ms. Subgoal 1.8.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 Ms : mems X1 (ScopeA::CtxA) ============================ mems X1 ([]::(ScopeB::CtxB))
< apply RelAB to Ms. Subgoal 1.8.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 Ms : mems X1 (ScopeA::CtxA) H4 : mems X1 (ScopeB::CtxB) ============================ mems X1 ([]::(ScopeB::CtxB))
< search. Subgoal 1.8.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 MF : mem X FN ============================ mem X NA
< apply mem_append_right to MF SNA5. Subgoal 1.8.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB M' : mem X FN1 MF : mem X FN H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.9: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (while Cond Body) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA ============================ mem X NA
< case IsS. Subgoal 1.9: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (while Cond Body) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body ============================ mem X NA
< SNB: case SNB. Subgoal 1.9: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB ============================ mem X NA
< Or: apply mem_append to M SNB2. Subgoal 1.9: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB Or : mem X CN1 \/ mem X BN1 ============================ mem X NA
< M': case Or. Subgoal 1.9.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X CN1 ============================ mem X NA
< MC: apply IH_E to _ _ _ _ SNA1 SNB M'. Subgoal 1.9.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X CN1 MC : mem X CN ============================ mem X NA
< apply mem_append_left to MC SNA3. Subgoal 1.9.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X CN1 MC : mem X CN H3 : mem X NA ============================ mem X NA
< search. Subgoal 1.9.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 ============================ mem X NA
< MB: apply IH_S to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.9.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 ============================ forall X1, mems X1 ([]::(ScopeA::CtxA)) -> mems X1 ([]::(ScopeB::CtxB))
< intros Ms. Subgoal 1.9.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 Ms : mems X1 ([]::(ScopeA::CtxA)) ============================ mems X1 ([]::(ScopeB::CtxB))
< Ms: case Ms. Subgoal 1.9.2.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 Ms : mem X1 [] ============================ mems X1 ([]::(ScopeB::CtxB))
< case Ms. Subgoal 1.9.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 Ms : mems X1 (ScopeA::CtxA) ============================ mems X1 ([]::(ScopeB::CtxB))
< apply RelAB to Ms. Subgoal 1.9.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 Ms : mems X1 (ScopeA::CtxA) H3 : mems X1 (ScopeB::CtxB) ============================ mems X1 ([]::(ScopeB::CtxB))
< search. Subgoal 1.9.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 MB : mem X BN ============================ mem X NA
< apply mem_append_right to MB SNA3. Subgoal 1.9.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB M' : mem X BN1 MB : mem X BN H3 : mem X NA ============================ mem X NA
< search. Subgoal 1.10: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X Ctx1 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (scopeStmt S1) NB CtxB' M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * ============================ mem X NA
< case IsS. Subgoal 1.10: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X Ctx1 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (scopeStmt S1) NB CtxB' M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 ============================ mem X NA
< SNB: case SNB. Subgoal 1.10: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 ============================ mem X NA
< apply IH_S to _ _ _ _ SNA1 SNB M. Subgoal 1.10.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 ============================ forall X1, mems X1 ([]::(ScopeA::CtxA)) -> mems X1 ([]::(ScopeB::CtxB))
< intros Ms. Subgoal 1.10.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 Ms : mems X1 ([]::(ScopeA::CtxA)) ============================ mems X1 ([]::(ScopeB::CtxB))
< Ms: case Ms. Subgoal 1.10.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 Ms : mem X1 [] ============================ mems X1 ([]::(ScopeB::CtxB))
< case Ms. Subgoal 1.10.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 Ms : mems X1 (ScopeA::CtxA) ============================ mems X1 ([]::(ScopeB::CtxB))
< apply RelAB to Ms. Subgoal 1.10.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 Ms : mems X1 (ScopeA::CtxA) H2 : mems X1 (ScopeB::CtxB) ============================ mems X1 ([]::(ScopeB::CtxB))
< search. Subgoal 1.10: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 H2 : mem X NA ============================ mem X NA
< search. Subgoal 1.11: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (printVal E) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * ============================ mem X NA
< case IsS. Subgoal 1.11: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (printVal E) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_expr E ============================ mem X NA
< SNB: case SNB. Subgoal 1.11: Variables: ScopeA CtxA NA ScopeB CtxB NB X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mem X NA
< apply IH_E to _ _ _ _ SNA1 SNB M. Subgoal 1.11: Variables: ScopeA CtxA NA ScopeB CtxB NB X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB H2 : mem X NA ============================ mem X NA
< search. Subgoal 2.1: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt noop IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) noop [] (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) noop NB CtxB' M : mems X (ScopeA::CtxA) ============================ mems X CtxB'
< case SNB. Subgoal 2.1: Variables: ScopeA CtxA ScopeB CtxB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt noop IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) noop [] (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) ============================ mems X (ScopeB::CtxB)
< backchain RelAB. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (seq S1 S2) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ SNB : stmtNames (ScopeB::CtxB) (seq S1 S2) NB CtxB' M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ SNB : stmtNames (ScopeB::CtxB) (seq S1 S2) NB CtxB' M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 Ctx1 N2 S2 S1 N3 Ctx2 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 Ctx1 * SNA2 : stmtNames Ctx1 S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB ============================ mems X CtxB'
< R: apply stmtNames_keep_older to _ _ SNA1. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 Ctx2 N4 Scope' IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 Ctx2 SNB1 : stmtNames Ctx2 S2 N4 CtxB' SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' ============================ mems X CtxB'
< R1: apply stmtNames_keep_older to _ _ SNB. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 ============================ mems X CtxB'
< apply stmtNames_isCtx to _ _ SNA1. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) ============================ mems X CtxB'
< apply stmtNames_isCtx to _ _ SNB. Subgoal 2.2: Variables: ScopeA CtxA NA CtxA' ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA CtxA' @ M : mems X CtxA' SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 CtxA' * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) ============================ mems X CtxB'
< R2: apply stmtNames_keep_older to _ _ SNA2. Subgoal 2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X N1 N2 S2 S1 N3 N4 Scope' Scope'1 Scope'2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA (Scope'2::CtxA) @ M : mems X (Scope'2::CtxA) SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 (Scope'2::CtxA) * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 CtxB' SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) R2 : forall X, mem X Scope' -> mem X Scope'2 ============================ mems X CtxB'
< R3: apply stmtNames_keep_older to _ _ SNB1. Subgoal 2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X N1 N2 S2 S1 N3 N4 Scope' Scope'1 Scope'2 Scope'3 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA (Scope'2::CtxA) @ M : mems X (Scope'2::CtxA) SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 (Scope'2::CtxA) * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 (Scope'3::CtxB) SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) R2 : forall X, mem X Scope' -> mem X Scope'2 R3 : forall X, mem X Scope'1 -> mem X Scope'3 ============================ mems X (Scope'3::CtxB)
< apply IH_S_C to _ _ _ _ SNA2 SNB1 M. Subgoal 2.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X N1 N2 S2 S1 N3 N4 Scope' Scope'1 Scope'2 Scope'3 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA (Scope'2::CtxA) @ M : mems X (Scope'2::CtxA) SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 (Scope'2::CtxA) * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 (Scope'3::CtxB) SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) R2 : forall X, mem X Scope' -> mem X Scope'2 R3 : forall X, mem X Scope'1 -> mem X Scope'3 ============================ forall X1, mems X1 (Scope'::CtxA) -> mems X1 (Scope'1::CtxB)
< intros M'. Subgoal 2.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X N1 N2 S2 S1 N3 N4 Scope' Scope'1 Scope'2 Scope'3 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA (Scope'2::CtxA) @ M : mems X (Scope'2::CtxA) SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 (Scope'2::CtxA) * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 (Scope'3::CtxB) SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) R2 : forall X, mem X Scope' -> mem X Scope'2 R3 : forall X, mem X Scope'1 -> mem X Scope'3 M' : mems X1 (Scope'::CtxA) ============================ mems X1 (Scope'1::CtxB)
< apply IH_S_C to _ _ _ _ SNA1 SNB M'. Subgoal 2.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X N1 N2 S2 S1 N3 N4 Scope' Scope'1 Scope'2 Scope'3 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA (Scope'2::CtxA) @ M : mems X (Scope'2::CtxA) SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 (Scope'2::CtxA) * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 (Scope'3::CtxB) SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) R2 : forall X, mem X Scope' -> mem X Scope'2 R3 : forall X, mem X Scope'1 -> mem X Scope'3 M' : mems X1 (Scope'::CtxA) H5 : mems X1 (Scope'1::CtxB) ============================ mems X1 (Scope'1::CtxB)
< search. Subgoal 2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X N1 N2 S2 S1 N3 N4 Scope' Scope'1 Scope'2 Scope'3 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (seq S1 S2) NA (Scope'2::CtxA) @ M : mems X (Scope'2::CtxA) SNA1 : stmtNames (ScopeA::CtxA) S1 N1 (Scope'::CtxA) * SNA2 : stmtNames (Scope'::CtxA) S2 N2 (Scope'2::CtxA) * SNA3 : N1 ++ N2 = NA H1 : is_stmt S1 H2 : is_stmt S2 SNB : stmtNames (ScopeB::CtxB) S1 N3 (Scope'1::CtxB) SNB1 : stmtNames (Scope'1::CtxB) S2 N4 (Scope'3::CtxB) SNB2 : N3 ++ N4 = NB R : forall X, mem X ScopeA -> mem X Scope' R1 : forall X, mem X ScopeB -> mem X Scope'1 H3 : is_list (is_list is_string) (Scope'::CtxA) H4 : is_list (is_list is_string) (Scope'1::CtxB) R2 : forall X, mem X Scope' -> mem X Scope'2 R3 : forall X, mem X Scope'1 -> mem X Scope'3 H5 : mems X (Scope'3::CtxB) ============================ mems X (Scope'3::CtxB)
< search. Subgoal 2.3: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (declare Ty X1 E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (declare Ty X1 E) NB CtxB' M : mems X ((X1::ScopeA)::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.3: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (declare Ty X1 E) NB CtxB' M : mems X ((X1::ScopeA)::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.3: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ M : mems X ((X1::ScopeA)::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mems X ((X1::ScopeB)::CtxB)
< M: case M. Subgoal 2.3.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X (X1::ScopeA) ============================ mems X ((X1::ScopeB)::CtxB)
< M: case M. Subgoal 2.3.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mems X1 ((X1::ScopeB)::CtxB)
< search. Subgoal 2.3.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA ============================ mems X ((X1::ScopeB)::CtxB)
< MB: apply RelAB to _ with X1 = X. Subgoal 2.3.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA MB : mems X (ScopeB::CtxB) ============================ mems X ((X1::ScopeB)::CtxB)
< case MB. Subgoal 2.3.1.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA H4 : mem X ScopeB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.3.1.2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA H4 : mems X CtxB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.3.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA ============================ mems X ((X1::ScopeB)::CtxB)
< MB: apply RelAB to _ with X1 = X. Subgoal 2.3.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA MB : mems X (ScopeB::CtxB) ============================ mems X ((X1::ScopeB)::CtxB)
< case MB. Subgoal 2.3.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA H4 : mem X ScopeB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.3.2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (declare Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA H4 : mems X CtxB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.4: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.4: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.4.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.4.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H3 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.4.2: Variables: ScopeA CtxA NA ScopeB CtxB X E X1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N ============================ mems X (ScopeB::CtxB)
< MB: apply RelAB to SNA1. Subgoal 2.4.2: Variables: ScopeA CtxA NA ScopeB CtxB X E X1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N MB : mems X1 (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< apply not_mems to SNB MB. Subgoal 2.5: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assign X1 E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * ============================ mems X CtxB'
< case IsS. Subgoal 2.5: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assign X1 E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.5.1: Variables: ScopeA CtxA ScopeB CtxB NB X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.5.1: Variables: ScopeA CtxA ScopeB CtxB NB X N X1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H3 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.5.2: Variables: ScopeA CtxA ScopeB CtxB X N X1 E N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.5.2: Variables: ScopeA CtxA ScopeB CtxB X N X1 E N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assign X1 E) (X1::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems X1 (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string X1 H2 : is_expr E SNB : not_mems X1 (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 H3 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.6: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.6: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.6.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.6.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X E Fields R IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H4 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.6.2: Variables: ScopeA CtxA NA ScopeB CtxB X E Fields R N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N ============================ mems X (ScopeB::CtxB)
< MB: apply RelAB to SNA1. Subgoal 2.6.2: Variables: ScopeA CtxA NA ScopeB CtxB X E Fields R N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E NA * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N MB : mems R (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< apply not_mems to SNB MB. Subgoal 2.7: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (recUpdate R Fields E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * ============================ mems X CtxB'
< case IsS. Subgoal 2.7: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (recUpdate R Fields E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.7.1: Variables: ScopeA CtxA ScopeB CtxB NB X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.7.1: Variables: ScopeA CtxA ScopeB CtxB NB X N R E Fields IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E NB H4 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.7.2: Variables: ScopeA CtxA ScopeB CtxB X N R E Fields N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.7.2: Variables: ScopeA CtxA ScopeB CtxB X N R E Fields N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (recUpdate R Fields E) (R::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems R (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) E N * H1 : is_string R H2 : is_list is_string Fields H3 : is_expr E SNB : not_mems R (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) E N1 H4 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.8: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (ifThenElse C T F) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (ifThenElse C T F) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.8: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN TN CtxT FN CtxF N1 F T C IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (ifThenElse C T F) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.8: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.8: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN TN CtxT FN CtxF N1 F T C CN1 TN1 CtxT1 FN1 CtxF1 N2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (ifThenElse C T F) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) C CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) T TN CtxT * SNA3 : stmtNames ([]::(ScopeA::CtxA)) F FN CtxF * SNA4 : CN ++ TN = N1 SNA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_stmt T H3 : is_stmt F SNB : exprNames (ScopeB::CtxB) C CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) T TN1 CtxT1 SNB2 : stmtNames ([]::(ScopeB::CtxB)) F FN1 CtxF1 SNB3 : CN1 ++ TN1 = N2 SNB4 : N2 ++ FN1 = NB H4 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.9: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (while Cond Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (while Cond Body) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.9: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X CN BN CtxB1 Body Cond IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (while Cond Body) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.9: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.9: Variables: ScopeA CtxA NA ScopeB CtxB NB X CN BN CtxB1 Body Cond CN1 BN1 CtxB2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (while Cond Body) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) Cond CN * SNA2 : stmtNames ([]::(ScopeA::CtxA)) Body BN CtxB1 * SNA3 : CN ++ BN = NA H1 : is_expr Cond H2 : is_stmt Body SNB : exprNames (ScopeB::CtxB) Cond CN1 SNB1 : stmtNames ([]::(ScopeB::CtxB)) Body BN1 CtxB2 SNB2 : CN1 ++ BN1 = NB H3 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.10: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X Ctx1 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (scopeStmt S1) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (scopeStmt S1) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * ============================ mems X CtxB'
< case IsS. Subgoal 2.10: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X Ctx1 S1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (scopeStmt S1) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.10: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.10: Variables: ScopeA CtxA NA ScopeB CtxB NB X Ctx1 S1 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (scopeStmt S1) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : stmtNames ([]::(ScopeA::CtxA)) S1 NA Ctx1 * H1 : is_stmt S1 SNB : stmtNames ([]::(ScopeB::CtxB)) S1 NB Ctx2 H2 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 2.11: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (printVal E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (printVal E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.11: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (printVal E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.11: Variables: ScopeA CtxA NA ScopeB CtxB NB X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.11: Variables: ScopeA CtxA NA ScopeB CtxB NB X E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (printVal E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB H2 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Subgoal 3.1: Variables: CtxA CtxB NB X I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (num I) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (num I) [] @ ENB : exprNames CtxB (num I) NB M : mem X NB ============================ mem X []
< case ENB. Subgoal 3.1: Variables: CtxA CtxB X I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (num I) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (num I) [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (plus E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ ENB : exprNames CtxB (plus E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ ENB : exprNames CtxB (plus E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.2.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.2.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.2.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.2.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.2.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.2.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (plus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.3: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (minus E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ ENB : exprNames CtxB (minus E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.3: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ ENB : exprNames CtxB (minus E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.3: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.3: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.3.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.3.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.3.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.3.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (minus E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.4: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (mult E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ ENB : exprNames CtxB (mult E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.4: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ ENB : exprNames CtxB (mult E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.4: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.4: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.4.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.4.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.4.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.4.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.4.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.4.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (mult E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.5: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (div E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ ENB : exprNames CtxB (div E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.5: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ ENB : exprNames CtxB (div E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.5: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.5: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.5.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.5.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.5.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.5.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.5.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.5.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (div E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.6: Variables: CtxA CtxB NB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr true IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA true [] @ ENB : exprNames CtxB true NB M : mem X NB ============================ mem X []
< case ENB. Subgoal 3.6: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr true IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA true [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 3.7: Variables: CtxA CtxB NB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr false IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA false [] @ ENB : exprNames CtxB false NB M : mem X NB ============================ mem X []
< case ENB. Subgoal 3.7: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr false IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA false [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 3.8: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (and E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ ENB : exprNames CtxB (and E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.8: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ ENB : exprNames CtxB (and E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.8: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.8: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.8.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.8.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.8.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.8.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.8.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.8.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (and E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.9: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (or E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ ENB : exprNames CtxB (or E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.9: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ ENB : exprNames CtxB (or E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.9: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.9: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.9.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.9.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.9.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.9.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.9.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.9.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (or E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.10: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (not E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (not E1) NA @ ENB : exprNames CtxB (not E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.10: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (not E1) NA @ ENB : exprNames CtxB (not E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ============================ mem X NA
< ENB: case ENB. Subgoal 3.10: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (not E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.10: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (not E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB H2 : mem X NA ============================ mem X NA
< search. Subgoal 3.11: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (greater E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ ENB : exprNames CtxB (greater E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.11: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ ENB : exprNames CtxB (greater E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.11: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.11: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.11.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.11.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.11.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.11.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.11.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.11.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (greater E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.12: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (eq E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ ENB : exprNames CtxB (eq E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.12: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ ENB : exprNames CtxB (eq E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.12: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.12: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.12.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.12.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.12.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.12.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.12.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.12.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (eq E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.13: Variables: CtxA CtxB NB X S IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (stringLit S) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stringLit S) [] @ ENB : exprNames CtxB (stringLit S) NB M : mem X NB ============================ mem X []
< case ENB. Subgoal 3.13: Variables: CtxA CtxB X S IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (stringLit S) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stringLit S) [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 3.14: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (appString E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ ENB : exprNames CtxB (appString E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.14: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ ENB : exprNames CtxB (appString E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.14: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.14: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.14.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.14.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.14.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.14.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.14.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.14.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (appString E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.15: Variables: CtxA CtxB NB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [] @ ENB : exprNames CtxB (name X1) NB M : mem X NB ENA1 : mems X1 CtxA ============================ mem X []
< ENB: case ENB. Subgoal 3.15.1: Variables: CtxA CtxB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [] @ M : mem X [] ENA1 : mems X1 CtxA ENB : mems X1 CtxB ============================ mem X []
< case M. Subgoal 3.15.2: Variables: CtxA CtxB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [] @ M : mem X [X1] ENA1 : mems X1 CtxA ENB : not_mems X1 CtxB ============================ mem X []
< M: case M. Subgoal 3.15.2.1: Variables: CtxA CtxB X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [] @ ENA1 : mems X1 CtxA ENB : not_mems X1 CtxB ============================ mem X1 []
< MB: apply RelAB to ENA1. Subgoal 3.15.2.1: Variables: CtxA CtxB X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [] @ ENA1 : mems X1 CtxA ENB : not_mems X1 CtxB MB : mems X1 CtxB ============================ mem X1 []
< apply not_mems to ENB MB. Subgoal 3.15.2.2: Variables: CtxA CtxB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [] @ ENA1 : mems X1 CtxA ENB : not_mems X1 CtxB M : mem X [] ============================ mem X []
< case M. Subgoal 3.16: Variables: CtxA CtxB NB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [X1] @ ENB : exprNames CtxB (name X1) NB M : mem X NB ENA1 : not_mems X1 CtxA ============================ mem X [X1]
< ENB: case ENB. Subgoal 3.16.1: Variables: CtxA CtxB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [X1] @ M : mem X [] ENA1 : not_mems X1 CtxA ENB : mems X1 CtxB ============================ mem X [X1]
< case M. Subgoal 3.16.2: Variables: CtxA CtxB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [X1] @ M : mem X [X1] ENA1 : not_mems X1 CtxA ENB : not_mems X1 CtxB ============================ mem X [X1]
< M: case M. Subgoal 3.16.2.1: Variables: CtxA CtxB X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [X1] @ ENA1 : not_mems X1 CtxA ENB : not_mems X1 CtxB ============================ mem X1 [X1]
< search. Subgoal 3.16.2.2: Variables: CtxA CtxB X X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (name X1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (name X1) [X1] @ ENA1 : not_mems X1 CtxA ENB : not_mems X1 CtxB M : mem X [] ============================ mem X [X1]
< case M. Subgoal 3.17: Variables: CtxA NA CtxB NB X Args F IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (call F Args) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (call F Args) NA @ ENB : exprNames CtxB (call F Args) NB M : mem X NB ENA1 : argsNames CtxA Args NA * ============================ mem X NA
< case IsE. Subgoal 3.17: Variables: CtxA NA CtxB NB X Args F IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (call F Args) NA @ ENB : exprNames CtxB (call F Args) NB M : mem X NB ENA1 : argsNames CtxA Args NA * H1 : is_string F H2 : is_args Args ============================ mem X NA
< ENB: case ENB. Subgoal 3.17: Variables: CtxA NA CtxB NB X Args F IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (call F Args) NA @ M : mem X NB ENA1 : argsNames CtxA Args NA * H1 : is_string F H2 : is_args Args ENB : argsNames CtxB Args NB ============================ mem X NA
< apply IH_A to _ _ _ _ ENA1 ENB M. Subgoal 3.17: Variables: CtxA NA CtxB NB X Args F IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (call F Args) NA @ M : mem X NB ENA1 : argsNames CtxA Args NA * H1 : is_string F H2 : is_args Args ENB : argsNames CtxB Args NB H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.18: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (stmtExpr S E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ ENB : exprNames CtxB (stmtExpr S E1) NB M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA ============================ mem X NA
< case IsE. Subgoal 3.18: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ ENB : exprNames CtxB (stmtExpr S E1) NB M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ============================ mem X NA
< ENB: case ENB. Subgoal 3.18: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.18: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB Or : mem X NS1 \/ mem X NE1 ============================ mem X NA
< M': case Or. Subgoal 3.18.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 ============================ mem X NA
< MNS: apply IH_S to _ _ _ _ ENA1 ENB M'. Subgoal 3.18.1.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 ============================ forall X1, mems X1 ([]::CtxA) -> mems X1 ([]::CtxB)
< intros Ms. Subgoal 3.18.1.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 Ms : mems X1 ([]::CtxA) ============================ mems X1 ([]::CtxB)
< Ms: case Ms. Subgoal 3.18.1.1.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 Ms : mem X1 [] ============================ mems X1 ([]::CtxB)
< case Ms. Subgoal 3.18.1.1.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 Ms : mems X1 CtxA ============================ mems X1 ([]::CtxB)
< apply RelAB to Ms. Subgoal 3.18.1.1.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 Ms : mems X1 CtxA H3 : mems X1 CtxB ============================ mems X1 ([]::CtxB)
< search. Subgoal 3.18.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 MNS : mem X NS ============================ mem X NA
< apply mem_append_left to MNS ENA3. Subgoal 3.18.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NS1 MNS : mem X NS H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.18.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 ============================ mem X NA
< apply stmtNames_isCtx to _ _ ENA1. Subgoal 3.18.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS ============================ mem X NA
< apply stmtNames_isCtx to _ _ ENB. Subgoal 3.18.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 ============================ mem X NA
< MNE: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.18.2.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 ============================ forall X1, mems X1 CtxS -> mems X1 CtxS1
< intros Ms. Subgoal 3.18.2.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS ============================ mems X1 CtxS1
< apply IH_S_C to _ _ _ _ ENA1 ENB Ms. Subgoal 3.18.2.1.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS ============================ forall X1, mems X1 ([]::CtxA) -> mems X1 ([]::CtxB)
< intros Ms'. Subgoal 3.18.2.1.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 X2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS Ms' : mems X2 ([]::CtxA) ============================ mems X2 ([]::CtxB)
< Ms': case Ms'. Subgoal 3.18.2.1.1.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 X2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS Ms' : mem X2 [] ============================ mems X2 ([]::CtxB)
< case Ms'. Subgoal 3.18.2.1.1.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 X2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS Ms' : mems X2 CtxA ============================ mems X2 ([]::CtxB)
< apply RelAB to Ms'. Subgoal 3.18.2.1.1.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 X2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS Ms' : mems X2 CtxA H5 : mems X2 CtxB ============================ mems X2 ([]::CtxB)
< search. Subgoal 3.18.2.1: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 Ms : mems X1 CtxS H5 : mems X1 CtxS1 ============================ mems X1 CtxS1
< search. Subgoal 3.18.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 MNE : mem X NE ============================ mem X NA
< apply mem_append_right to MNE ENA3. Subgoal 3.18.2: Variables: CtxA NA CtxB NB X NS CtxS NE E1 S NS1 CtxS1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (stmtExpr S E1) NA @ M : mem X NB ENA1 : stmtNames ([]::CtxA) S NS CtxS * ENA2 : exprNames CtxS E1 NE * ENA3 : NS ++ NE = NA H1 : is_stmt S H2 : is_expr E1 ENB : stmtNames ([]::CtxB) S NS1 CtxS1 ENB1 : exprNames CtxS1 E1 NE1 ENB2 : NS1 ++ NE1 = NB M' : mem X NE1 H3 : is_list (is_list is_string) CtxS H4 : is_list (is_list is_string) CtxS1 MNE : mem X NE H5 : mem X NA ============================ mem X NA
< search. Subgoal 3.19: Variables: CtxA NA CtxB NB X RF IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (recBuild RF) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recBuild RF) NA @ ENB : exprNames CtxB (recBuild RF) NB M : mem X NB ENA1 : recFieldNames CtxA RF NA * ============================ mem X NA
< case IsE. Subgoal 3.19: Variables: CtxA NA CtxB NB X RF IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recBuild RF) NA @ ENB : exprNames CtxB (recBuild RF) NB M : mem X NB ENA1 : recFieldNames CtxA RF NA * H1 : is_recFieldExprs RF ============================ mem X NA
< ENB: case ENB. Subgoal 3.19: Variables: CtxA NA CtxB NB X RF IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recBuild RF) NA @ M : mem X NB ENA1 : recFieldNames CtxA RF NA * H1 : is_recFieldExprs RF ENB : recFieldNames CtxB RF NB ============================ mem X NA
< apply IH_RF to _ _ _ _ ENA1 ENB M. Subgoal 3.19: Variables: CtxA NA CtxB NB X RF IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recBuild RF) NA @ M : mem X NB ENA1 : recFieldNames CtxA RF NA * H1 : is_recFieldExprs RF ENB : recFieldNames CtxB RF NB H2 : mem X NA ============================ mem X NA
< search. Subgoal 3.20: Variables: CtxA NA CtxB NB X F E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (recFieldAccess E1 F) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recFieldAccess E1 F) NA @ ENB : exprNames CtxB (recFieldAccess E1 F) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.20: Variables: CtxA NA CtxB NB X F E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recFieldAccess E1 F) NA @ ENB : exprNames CtxB (recFieldAccess E1 F) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_string F ============================ mem X NA
< ENB: case ENB. Subgoal 3.20: Variables: CtxA NA CtxB NB X F E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recFieldAccess E1 F) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_string F ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.20: Variables: CtxA NA CtxB NB X F E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (recFieldAccess E1 F) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_string F ENB : exprNames CtxB E1 NB H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.21: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (errorExpr E1 Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (errorExpr E1 Ty) NA @ ENB : exprNames CtxB (errorExpr E1 Ty) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.21: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (errorExpr E1 Ty) NA @ ENB : exprNames CtxB (errorExpr E1 Ty) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_typ Ty ============================ mem X NA
< ENB: case ENB. Subgoal 3.21: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (errorExpr E1 Ty) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.21: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (errorExpr E1 Ty) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames CtxB E1 NB H3 : mem X NA ============================ mem X NA
< search. Subgoal 4: Variables: CtxA A NA CtxB NB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsA : is_args A IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA A NA @ ANB : argsNames CtxB A NB M : mem X NB ============================ mem X NA
< ANA: case ANA (keep). Subgoal 4.1: Variables: CtxA CtxB NB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsA : is_args nilArgs IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA nilArgs [] @ ANB : argsNames CtxB nilArgs NB M : mem X NB ============================ mem X []
< case ANB. Subgoal 4.1: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsA : is_args nilArgs IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA nilArgs [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 4.2: Variables: CtxA NA CtxB NB X EN AN A1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsA : is_args (consArgs E A1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ ANB : argsNames CtxB (consArgs E A1) NB M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA ============================ mem X NA
< case IsA. Subgoal 4.2: Variables: CtxA NA CtxB NB X EN AN A1 E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ ANB : argsNames CtxB (consArgs E A1) NB M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ============================ mem X NA
< ANB: case ANB. Subgoal 4.2: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB ============================ mem X NA
< Or: apply mem_append to M ANB2. Subgoal 4.2: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB Or : mem X EN1 \/ mem X AN1 ============================ mem X NA
< M': case Or. Subgoal 4.2.1: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB M' : mem X EN1 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ANA1 ANB M'. Subgoal 4.2.1: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB M' : mem X EN1 M1 : mem X EN ============================ mem X NA
< apply mem_append_left to M1 ANA3. Subgoal 4.2.1: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB M' : mem X EN1 M1 : mem X EN H3 : mem X NA ============================ mem X NA
< search. Subgoal 4.2.2: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB M' : mem X AN1 ============================ mem X NA
< M2: apply IH_A to _ _ _ _ ANA2 ANB1 M'. Subgoal 4.2.2: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB M' : mem X AN1 M2 : mem X AN ============================ mem X NA
< apply mem_append_right to M2 ANA3. Subgoal 4.2.2: Variables: CtxA NA CtxB NB X EN AN A1 E EN1 AN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ANA : argsNames CtxA (consArgs E A1) NA @ M : mem X NB ANA1 : exprNames CtxA E EN * ANA2 : argsNames CtxA A1 AN * ANA3 : EN ++ AN = NA H1 : is_expr E H2 : is_args A1 ANB : exprNames CtxB E EN1 ANB1 : argsNames CtxB A1 AN1 ANB2 : EN1 ++ AN1 = NB M' : mem X AN1 M2 : mem X AN H3 : mem X NA ============================ mem X NA
< search. Subgoal 5: Variables: CtxA RF NA CtxB NB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsRF : is_recFieldExprs RF IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA RF NA @ RFNB : recFieldNames CtxB RF NB M : mem X NB ============================ mem X NA
< RFNA: case RFNA (keep). Subgoal 5.1: Variables: CtxA CtxB NB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsRF : is_recFieldExprs nilRecFieldExprs IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA nilRecFieldExprs [] @ RFNB : recFieldNames CtxB nilRecFieldExprs NB M : mem X NB ============================ mem X []
< case RFNB. Subgoal 5.1: Variables: CtxA CtxB X IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsRF : is_recFieldExprs nilRecFieldExprs IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA nilRecFieldExprs [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 5.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ RFNB : recFieldNames CtxB (consRecFieldExprs F E RF1) NB M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA ============================ mem X NA
< case IsRF. Subgoal 5.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ RFNB : recFieldNames CtxB (consRecFieldExprs F E RF1) NB M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ mem X NA
< RFNB: case RFNB. Subgoal 5.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB ============================ mem X NA
< Or: apply mem_append to M RFNB2. Subgoal 5.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB Or : mem X EN1 \/ mem X RN1 ============================ mem X NA
< M': case Or. Subgoal 5.2.1: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB M' : mem X EN1 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ RFNA1 RFNB M'. Subgoal 5.2.1: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB M' : mem X EN1 M1 : mem X EN ============================ mem X NA
< apply mem_append_left to M1 RFNA3. Subgoal 5.2.1: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB M' : mem X EN1 M1 : mem X EN H4 : mem X NA ============================ mem X NA
< search. Subgoal 5.2.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB M' : mem X RN1 ============================ mem X NA
< M2: apply IH_RF to _ _ _ _ RFNA2 RFNB1 M'. Subgoal 5.2.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB M' : mem X RN1 M2 : mem X RN ============================ mem X NA
< apply mem_append_right to M2 RFNA3. Subgoal 5.2.2: Variables: CtxA NA CtxB NB X EN RN RF1 E F EN1 RN1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB RFNA : recFieldNames CtxA (consRecFieldExprs F E RF1) NA @ M : mem X NB RFNA1 : exprNames CtxA E EN * RFNA2 : recFieldNames CtxA RF1 RN * RFNA3 : EN ++ RN = NA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 RFNB : exprNames CtxB E EN1 RFNB1 : recFieldNames CtxB RF1 RN1 RFNB2 : EN1 ++ RN1 = NB M' : mem X RN1 M2 : mem X RN H4 : mem X NA ============================ mem X NA
< search. Proof completed.
< Projection_Constraint proj_exprNames : forall Names E E_P Ctx N N_P X, Pr : Names |{expr}- E ~~> E_P -> IsE : is_expr E -> IsNames : is_list is_string Names -> IsCtx : is_list (is_list is_string) Ctx -> EN : exprNames Ctx E N -> EN_P : exprNames Ctx E_P N_P -> M : mem X N_P -> mem X N. Proof completed.
< Projection_Constraint proj_stmtNames : forall Names S S_P Scope Ctx N Ctx' N_P Ctx'_P X, Pr : Names |{stmt}- S ~~> S_P -> IsS : is_stmt S -> IsNames : is_list is_string Names -> IsCtx : is_list (is_list is_string) (Scope::Ctx) -> SN : stmtNames (Scope::Ctx) S N Ctx' -> SN_P : stmtNames (Scope::Ctx) S_P N_P Ctx'_P -> M : mem X N_P -> mem X N. Proof completed.
< Projection_Constraint proj_stmtNames_names_forward : forall Names S S_P Scope Ctx N Ctx' N_P Ctx'_P X, Pr : Names |{stmt}- S ~~> S_P -> IsS : is_stmt S -> IsNames : is_list is_string Names -> IsCtx : is_list (is_list is_string) (Scope::Ctx) -> SN : stmtNames (Scope::Ctx) S N Ctx' -> SN_P : stmtNames (Scope::Ctx) S_P N_P Ctx'_P -> M : mems X Ctx' -> mems X Ctx'_P. Proof completed.
< Projection_Constraint proj_stmtNames_names_backward : forall Names S S_P Scope Ctx N Ctx' N_P Ctx'_P X, Pr : Names |{stmt}- S ~~> S_P -> IsS : is_stmt S -> IsNames : is_list is_string Names -> IsCtx : is_list (is_list is_string) (Scope::Ctx) -> SN : stmtNames (Scope::Ctx) S N Ctx' -> SN_P : stmtNames (Scope::Ctx) S_P N_P Ctx'_P -> M : mems X Ctx'_P -> mems X Ctx'. Proof completed.
< Theorem is_list_mem_lookup_type : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'. ============================ forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'
< induction on 2. IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' ============================ forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L @ -> is_string ID -> exists E', lookup L ID E'
< intros IsL Mem IsID. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string is_typ) L Mem : mem (ID, E) L @ IsID : is_string ID ============================ exists E', lookup L ID E'
< Mem: case Mem. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string is_typ) ((ID, E)::Rest) IsID : is_string ID ============================ exists E', lookup ((ID, E)::Rest) ID E'
< search. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string is_typ) (I::Rest) IsID : is_string ID Mem : mem (ID, E) Rest * ============================ exists E', lookup (I::Rest) ID E'
< Is: case IsL. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is : is_pair is_string is_typ I Is1 : is_list (is_pair is_string is_typ) Rest ============================ exists E', lookup (I::Rest) ID E'
< Is: case Is. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_typ) Rest Is : is_string A Is2 : is_typ B ============================ exists E', lookup ((A, B)::Rest) ID E'
< Or: apply is_string_eq_or_not to Is IsID. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_typ) Rest Is : is_string A Is2 : is_typ B Or : A = ID \/ (A = ID -> false) ============================ exists E', lookup ((A, B)::Rest) ID E'
< Eq: case Or. Subgoal 2.1: Variables: ID E Rest B IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_typ) Rest Is : is_string ID Is2 : is_typ B ============================ exists E', lookup ((ID, B)::Rest) ID E'
< search. Subgoal 2.2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_typ) Rest Is : is_string A Is2 : is_typ B Eq : A = ID -> false ============================ exists E', lookup ((A, B)::Rest) ID E'
< apply IH to Is1 Mem IsID. Subgoal 2.2: Variables: ID E Rest B A E' IH : forall L ID E, is_list (is_pair is_string is_typ) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_typ) Rest Is : is_string A Is2 : is_typ B Eq : A = ID -> false H1 : lookup Rest ID E' ============================ exists E', lookup ((A, B)::Rest) ID E'
< search. Proof completed.
< Theorem lookup_is_type : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E -> is_typ E. ============================ forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E -> is_typ E
< induction on 2. IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E ============================ forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E @ -> is_typ E
< intros IsL Lkp. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E IsL : is_list (is_pair is_string is_typ) L Lkp : lookup L ID E @ ============================ is_typ E
< Lkp: case Lkp. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E IsL : is_list (is_pair is_string is_typ) ((ID, E)::Rest) ============================ is_typ E
< Is: case IsL. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E Is : is_pair is_string is_typ (ID, E) Is1 : is_list (is_pair is_string is_typ) Rest ============================ is_typ E
< case Is. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E Is1 : is_list (is_pair is_string is_typ) Rest H1 : is_string ID H2 : is_typ E ============================ is_typ E
< search. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E IsL : is_list (is_pair is_string is_typ) ((K, V)::Rest) Lkp : K = ID -> false Lkp1 : lookup Rest ID E * ============================ is_typ E
< Is: case IsL. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_typ (K, V) Is1 : is_list (is_pair is_string is_typ) Rest ============================ is_typ E
< apply IH to Is1 Lkp1. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_typ E Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_typ (K, V) Is1 : is_list (is_pair is_string is_typ) Rest H1 : is_typ E ============================ is_typ E
< search. Proof completed.
< Theorem lookup_is_key_type : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E -> is_string ID. ============================ forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E -> is_string ID
< induction on 2. IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID ============================ forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E @ -> is_string ID
< intros IsL Lkp. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID IsL : is_list (is_pair is_string is_typ) L Lkp : lookup L ID E @ ============================ is_string ID
< Lkp: case Lkp. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID IsL : is_list (is_pair is_string is_typ) ((ID, E)::Rest) ============================ is_string ID
< Is: case IsL. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID Is : is_pair is_string is_typ (ID, E) Is1 : is_list (is_pair is_string is_typ) Rest ============================ is_string ID
< case Is. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID Is1 : is_list (is_pair is_string is_typ) Rest H1 : is_string ID H2 : is_typ E ============================ is_string ID
< search. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID IsL : is_list (is_pair is_string is_typ) ((K, V)::Rest) Lkp : K = ID -> false Lkp1 : lookup Rest ID E * ============================ is_string ID
< Is: case IsL. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_typ (K, V) Is1 : is_list (is_pair is_string is_typ) Rest ============================ is_string ID
< apply IH to Is1 Lkp1. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_typ) L -> lookup L ID E * -> is_string ID Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_typ (K, V) Is1 : is_list (is_pair is_string is_typ) Rest H1 : is_string ID ============================ is_string ID
< search. Proof completed.
< Theorem mem_is_type : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L -> is_pair is_string is_typ IDE. ============================ forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L -> is_pair is_string is_typ IDE
< induction on 2. IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE ============================ forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L @ -> is_pair is_string is_typ IDE
< intros Is M. Variables: L IDE IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE Is : is_list (is_pair is_string is_typ) L M : mem IDE L @ ============================ is_pair is_string is_typ IDE
< M: case M. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE Is : is_list (is_pair is_string is_typ) (IDE::Rest) ============================ is_pair is_string is_typ IDE
< case Is. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE H1 : is_pair is_string is_typ IDE H2 : is_list (is_pair is_string is_typ) Rest ============================ is_pair is_string is_typ IDE
< search. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE Is : is_list (is_pair is_string is_typ) (I::Rest) M : mem IDE Rest * ============================ is_pair is_string is_typ IDE
< case Is. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE M : mem IDE Rest * H1 : is_pair is_string is_typ I H2 : is_list (is_pair is_string is_typ) Rest ============================ is_pair is_string is_typ IDE
< apply IH to _ M. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string is_typ) L -> mem IDE L * -> is_pair is_string is_typ IDE M : mem IDE Rest * H1 : is_pair is_string is_typ I H2 : is_list (is_pair is_string is_typ) Rest H3 : is_pair is_string is_typ IDE ============================ is_pair is_string is_typ IDE
< search. Proof completed.
< Theorem zip_is_type : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L -> is_list (is_pair is_string is_typ) L. ============================ forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L -> is_list (is_pair is_string is_typ) L
< induction on 3. IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L ============================ forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L @ -> is_list (is_pair is_string is_typ) L
< intros IsA IsB Z. Variables: A B L IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L IsA : is_list is_string A IsB : is_list is_typ B Z : zip A B L @ ============================ is_list (is_pair is_string is_typ) L
< Z: case Z. Subgoal 1: IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L IsA : is_list is_string [] IsB : is_list is_typ [] ============================ is_list (is_pair is_string is_typ) []
< search. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L IsA : is_list is_string (A1::ARest) IsB : is_list is_typ (B1::BRest) Z : zip ARest BRest Rest * ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< IsA: case IsA. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L IsB : is_list is_typ (B1::BRest) Z : zip ARest BRest Rest * IsA : is_string A1 IsA1 : is_list is_string ARest ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< IsB: case IsB. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L Z : zip ARest BRest Rest * IsA : is_string A1 IsA1 : is_list is_string ARest IsB : is_typ B1 IsB1 : is_list is_typ BRest ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< apply IH to _ _ Z. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_typ B -> zip A B L * -> is_list (is_pair is_string is_typ) L Z : zip ARest BRest Rest * IsA : is_string A1 IsA1 : is_list is_string ARest IsB : is_typ B1 IsB1 : is_list is_typ BRest H1 : is_list (is_pair is_string is_typ) Rest ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< search. Proof completed.
< Theorem length_exists_list_pair_string_ty : forall L, is_list (is_list (is_pair is_string is_typ)) L -> exists N, length L N. ============================ forall L, is_list (is_list (is_pair is_string is_typ)) L -> exists N, length L N
< induction on 1. IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N ============================ forall L, is_list (is_list (is_pair is_string is_typ)) L @ -> exists N, length L N
< intros IsL. Variables: L IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N IsL : is_list (is_list (is_pair is_string is_typ)) L @ ============================ exists N, length L N
< IsL: case IsL. Subgoal 1: IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N ============================ exists N, length [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_typ) H * IsL1 : is_list (is_list (is_pair is_string is_typ)) T * ============================ exists N, length (H::T) N
< Len: apply IH to IsL1. Subgoal 2: Variables: T H N IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_typ) H * IsL1 : is_list (is_list (is_pair is_string is_typ)) T * Len : length T N ============================ exists N, length (H::T) N
< Is: apply length_is to Len. Subgoal 2: Variables: T H N IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_typ) H * IsL1 : is_list (is_list (is_pair is_string is_typ)) T * Len : length T N Is : is_integer N ============================ exists N, length (H::T) N
< apply plus_integer_total to _ Is with N1 = 1. Subgoal 2: Variables: T H N N3 IH : forall L, is_list (is_list (is_pair is_string is_typ)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_typ) H * IsL1 : is_list (is_list (is_pair is_string is_typ)) T * Len : length T N Is : is_integer N H1 : 1 + N = N3 ============================ exists N, length (H::T) N
< search. Proof completed.
< Theorem is_list_mem_lookup_funTyCtx : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'. ============================ forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'
< induction on 2. IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' ============================ forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L @ -> is_string ID -> exists E', lookup L ID E'
< intros IsL Mem IsID. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L Mem : mem (ID, E) L @ IsID : is_string ID ============================ exists E', lookup L ID E'
< Mem: case Mem. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) ((ID, E)::Rest) IsID : is_string ID ============================ exists E', lookup ((ID, E)::Rest) ID E'
< search. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) (I::Rest) IsID : is_string ID Mem : mem (ID, E) Rest * ============================ exists E', lookup (I::Rest) ID E'
< Is: case IsL. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is : is_pair is_string (is_pair is_typ (is_list is_typ)) I Is1 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest ============================ exists E', lookup (I::Rest) ID E'
< Is: case Is. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest Is : is_string A Is2 : is_pair is_typ (is_list is_typ) B ============================ exists E', lookup ((A, B)::Rest) ID E'
< Or: apply is_string_eq_or_not to Is IsID. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest Is : is_string A Is2 : is_pair is_typ (is_list is_typ) B Or : A = ID \/ (A = ID -> false) ============================ exists E', lookup ((A, B)::Rest) ID E'
< Eq: case Or. Subgoal 2.1: Variables: ID E Rest B IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest Is : is_string ID Is2 : is_pair is_typ (is_list is_typ) B ============================ exists E', lookup ((ID, B)::Rest) ID E'
< search. Subgoal 2.2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest Is : is_string A Is2 : is_pair is_typ (is_list is_typ) B Eq : A = ID -> false ============================ exists E', lookup ((A, B)::Rest) ID E'
< apply IH to Is1 Mem IsID. Subgoal 2.2: Variables: ID E Rest B A E' IH : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest Is : is_string A Is2 : is_pair is_typ (is_list is_typ) B Eq : A = ID -> false H1 : lookup Rest ID E' ============================ exists E', lookup ((A, B)::Rest) ID E'
< search. Proof completed.
< Theorem mem_is_funTyCtx : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE. ============================ forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< induction on 2. IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE ============================ forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L @ -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< intros Is M. Variables: L IDE IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L M : mem IDE L @ ============================ is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< M: case M. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) (IDE::Rest) ============================ is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< case Is. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE H1 : is_pair is_string (is_pair is_typ (is_list is_typ)) IDE H2 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest ============================ is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< search. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) (I::Rest) M : mem IDE Rest * ============================ is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< case Is. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE M : mem IDE Rest * H1 : is_pair is_string (is_pair is_typ (is_list is_typ)) I H2 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest ============================ is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< apply IH to _ M. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> mem IDE L * -> is_pair is_string (is_pair is_typ (is_list is_typ)) IDE M : mem IDE Rest * H1 : is_pair is_string (is_pair is_typ (is_list is_typ)) I H2 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Rest H3 : is_pair is_string (is_pair is_typ (is_list is_typ)) IDE ============================ is_pair is_string (is_pair is_typ (is_list is_typ)) IDE
< search. Proof completed.
< Theorem lookup_is_value_funTyCtx : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> lookup L ID E -> is_pair is_typ (is_list is_typ) E. ============================ forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> lookup L ID E -> is_pair is_typ (is_list is_typ) E
< intros Is L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E ============================ is_pair is_typ (is_list is_typ) E
< M: apply lookup_mem to L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E M : mem (ID, E) L ============================ is_pair is_typ (is_list is_typ) E
< Is: apply mem_is_funTyCtx to _ M. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E M : mem (ID, E) L Is1 : is_pair is_string (is_pair is_typ (is_list is_typ)) (ID, E) ============================ is_pair is_typ (is_list is_typ) E
< case Is1. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E M : mem (ID, E) L H1 : is_string ID H2 : is_pair is_typ (is_list is_typ) E ============================ is_pair is_typ (is_list is_typ) E
< search. Proof completed.
< Theorem lookup_is_key_funTyCtx : forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> lookup L ID E -> is_string ID. ============================ forall L ID E, is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L -> lookup L ID E -> is_string ID
< intros Is L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E ============================ is_string ID
< M: apply lookup_mem to L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E M : mem (ID, E) L ============================ is_string ID
< Is: apply mem_is_funTyCtx to _ M. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E M : mem (ID, E) L Is1 : is_pair is_string (is_pair is_typ (is_list is_typ)) (ID, E) ============================ is_string ID
< case Is1. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) L L : lookup L ID E M : mem (ID, E) L H1 : is_string ID H2 : is_pair is_typ (is_list is_typ) E ============================ is_string ID
< search. Proof completed.
< Theorem lookupScopes_isTy : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty -> is_typ Ty. ============================ forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty -> is_typ Ty
< induction on 2. IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty ============================ forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty @ -> is_typ Ty
< intros Is L. Variables: L X Ty IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty Is : is_list (is_list (is_pair is_string is_typ)) L L : lookupScopes X L Ty @ ============================ is_typ Ty
< L: case L. Subgoal 1: Variables: X Ty Rest L1 IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty Is : is_list (is_list (is_pair is_string is_typ)) (L1::Rest) L : lookup L1 X Ty ============================ is_typ Ty
< case Is. Subgoal 1: Variables: X Ty Rest L1 IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty L : lookup L1 X Ty H1 : is_list (is_pair is_string is_typ) L1 H2 : is_list (is_list (is_pair is_string is_typ)) Rest ============================ is_typ Ty
< apply lookup_is_type to _ L. Subgoal 1: Variables: X Ty Rest L1 IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty L : lookup L1 X Ty H1 : is_list (is_pair is_string is_typ) L1 H2 : is_list (is_list (is_pair is_string is_typ)) Rest H3 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 2: Variables: X Ty Rest L1 IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty Is : is_list (is_list (is_pair is_string is_typ)) (L1::Rest) L : no_lookup L1 X L1 : lookupScopes X Rest Ty * ============================ is_typ Ty
< case Is. Subgoal 2: Variables: X Ty Rest L1 IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty L : no_lookup L1 X L1 : lookupScopes X Rest Ty * H1 : is_list (is_pair is_string is_typ) L1 H2 : is_list (is_list (is_pair is_string is_typ)) Rest ============================ is_typ Ty
< apply IH to _ L1. Subgoal 2: Variables: X Ty Rest L1 IH : forall L X Ty, is_list (is_list (is_pair is_string is_typ)) L -> lookupScopes X L Ty * -> is_typ Ty L : no_lookup L1 X L1 : lookupScopes X Rest Ty * H1 : is_list (is_pair is_string is_typ) L1 H2 : is_list (is_list (is_pair is_string is_typ)) Rest H3 : is_typ Ty ============================ is_typ Ty
< search. Proof completed.
< Theorem zip_is_string_ty : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z -> is_list (is_pair is_string is_typ) Z. ============================ forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z -> is_list (is_pair is_string is_typ) Z
< induction on 3. IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z ============================ forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z @ -> is_list (is_pair is_string is_typ) Z
< intros IsA IsB Z. Variables: A B Z IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z IsA : is_list is_string A IsB : is_list is_typ B Z : zip A B Z @ ============================ is_list (is_pair is_string is_typ) Z
< Z: case Z. Subgoal 1: IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z IsA : is_list is_string [] IsB : is_list is_typ [] ============================ is_list (is_pair is_string is_typ) []
< search. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z IsA : is_list is_string (A1::ARest) IsB : is_list is_typ (B1::BRest) Z : zip ARest BRest Rest * ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< case IsA. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z IsB : is_list is_typ (B1::BRest) Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< case IsB. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest H3 : is_typ B1 H4 : is_list is_typ BRest ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< apply IH to _ _ Z. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_typ B -> zip A B Z * -> is_list (is_pair is_string is_typ) Z Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest H3 : is_typ B1 H4 : is_list is_typ BRest H5 : is_list (is_pair is_string is_typ) Rest ============================ is_list (is_pair is_string is_typ) ((A1, B1)::Rest)
< search. Proof completed.
< Theorem length_exists_ty : forall L, is_list is_typ L -> exists N, length L N. ============================ forall L, is_list is_typ L -> exists N, length L N
< induction on 1. IH : forall L, is_list is_typ L * -> exists N, length L N ============================ forall L, is_list is_typ L @ -> exists N, length L N
< intros IsL. Variables: L IH : forall L, is_list is_typ L * -> exists N, length L N IsL : is_list is_typ L @ ============================ exists N, length L N
< IsL: case IsL. Subgoal 1: IH : forall L, is_list is_typ L * -> exists N, length L N ============================ exists N, length [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_typ L * -> exists N, length L N IsL : is_typ H IsL1 : is_list is_typ T * ============================ exists N, length (H::T) N
< Len: apply IH to IsL1. Subgoal 2: Variables: T H N IH : forall L, is_list is_typ L * -> exists N, length L N IsL : is_typ H IsL1 : is_list is_typ T * Len : length T N ============================ exists N, length (H::T) N
< Is: apply length_is to Len. Subgoal 2: Variables: T H N IH : forall L, is_list is_typ L * -> exists N, length L N IsL : is_typ H IsL1 : is_list is_typ T * Len : length T N Is : is_integer N ============================ exists N, length (H::T) N
< apply plus_integer_total to _ Is with N1 = 1. Subgoal 2: Variables: T H N N3 IH : forall L, is_list is_typ L * -> exists N, length L N IsL : is_typ H IsL1 : is_list is_typ T * Len : length T N Is : is_integer N H1 : 1 + N = N3 ============================ exists N, length (H::T) N
< search. Proof completed.
< Theorem lookupRecFieldTy_is : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty -> is_typ Ty. ============================ forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty -> is_typ Ty
< induction on 2. IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty ============================ forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty @ -> is_typ Ty
< intros IsF L. Variables: Fields F Ty IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty IsF : is_recFieldTys Fields L : lookupRecFieldTy Fields F Ty @ ============================ is_typ Ty
< L: case L. Subgoal 1: Variables: F Ty Rest IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty IsF : is_recFieldTys (consRecFieldTys F Ty Rest) ============================ is_typ Ty
< case IsF. Subgoal 1: Variables: F Ty Rest IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty H1 : is_string F H2 : is_typ Ty H3 : is_recFieldTys Rest ============================ is_typ Ty
< search. Subgoal 2: Variables: F Ty Rest XTy X IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty IsF : is_recFieldTys (consRecFieldTys X XTy Rest) L : X = F -> false L1 : lookupRecFieldTy Rest F Ty * ============================ is_typ Ty
< case IsF. Subgoal 2: Variables: F Ty Rest XTy X IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty L : X = F -> false L1 : lookupRecFieldTy Rest F Ty * H1 : is_string X H2 : is_typ XTy H3 : is_recFieldTys Rest ============================ is_typ Ty
< apply IH to _ L1. Subgoal 2: Variables: F Ty Rest XTy X IH : forall Fields F Ty, is_recFieldTys Fields -> lookupRecFieldTy Fields F Ty * -> is_typ Ty L : X = F -> false L1 : lookupRecFieldTy Rest F Ty * H1 : is_string X H2 : is_typ XTy H3 : is_recFieldTys Rest H4 : is_typ Ty ============================ is_typ Ty
< search. Proof completed.
< Theorem lookupRecFieldTy_unique : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA -> lookupRecFieldTy Fields F TyB -> TyA = TyB. ============================ forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA -> lookupRecFieldTy Fields F TyB -> TyA = TyB
< induction on 1. IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB ============================ forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA @ -> lookupRecFieldTy Fields F TyB -> TyA = TyB
< intros LA LB. Variables: Fields F TyA TyB IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LA : lookupRecFieldTy Fields F TyA @ LB : lookupRecFieldTy Fields F TyB ============================ TyA = TyB
< LA: case LA. Subgoal 1: Variables: F TyA TyB Rest IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LB : lookupRecFieldTy (consRecFieldTys F TyA Rest) F TyB ============================ TyA = TyB
< LB: case LB. Subgoal 1.1: Variables: F TyB Rest IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB ============================ TyB = TyB
< search. Subgoal 1.2: Variables: F TyA TyB Rest IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LB : F = F -> false LB1 : lookupRecFieldTy Rest F TyB ============================ TyA = TyB
< apply LB to _. Subgoal 2: Variables: F TyA TyB Rest XTy X IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LB : lookupRecFieldTy (consRecFieldTys X XTy Rest) F TyB LA : X = F -> false LA1 : lookupRecFieldTy Rest F TyA * ============================ TyA = TyB
< LB: case LB. Subgoal 2.1: Variables: F TyA TyB Rest IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LA : F = F -> false LA1 : lookupRecFieldTy Rest F TyA * ============================ TyA = TyB
< apply LA to _. Subgoal 2.2: Variables: F TyA TyB Rest XTy X IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LA : X = F -> false LA1 : lookupRecFieldTy Rest F TyA * LB : X = F -> false LB1 : lookupRecFieldTy Rest F TyB ============================ TyA = TyB
< apply IH to LA1 LB1. Subgoal 2.2: Variables: F TyB Rest XTy X IH : forall Fields F TyA TyB, lookupRecFieldTy Fields F TyA * -> lookupRecFieldTy Fields F TyB -> TyA = TyB LA : X = F -> false LA1 : lookupRecFieldTy Rest F TyB * LB : X = F -> false LB1 : lookupRecFieldTy Rest F TyB ============================ TyB = TyB
< search. Proof completed.
< Extensible_Theorem typeOf_isTy : forall E FT ET Ty, IsE : is_expr E -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> Ty : typeOf FT ET E Ty -> is_typ Ty on Ty, stmtOK_isCtx : forall S FT ET ET', IsS : is_stmt S -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> Ty : stmtOK FT ET S ET' -> is_list (is_list (is_pair is_string is_typ)) ET' on Tyalso typeOfArgs_isTy : forall A FT ET Tys, IsA : is_args A -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> Ty : typeOfArgs FT ET A Tys -> is_list is_typ Tys on Ty, typeOfRecFields_isTy : forall RF FT ET Fields, IsRF : is_recFieldExprs RF -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> Ty : typeOfRecFields FT ET RF Fields -> is_recFieldTys Fields on Ty. Subgoal 1.1: Variables: FT ET I IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (num I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (num I) intTy @ ============================ is_typ intTy
< search. Subgoal 1.2: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (plus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (plus E1 E2) intTy @ Ty1 : typeOf FT ET E1 intTy * Ty2 : typeOf FT ET E2 intTy * ============================ is_typ intTy
< search. Subgoal 1.3: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (minus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (minus E1 E2) intTy @ Ty1 : typeOf FT ET E1 intTy * Ty2 : typeOf FT ET E2 intTy * ============================ is_typ intTy
< search. Subgoal 1.4: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (mult E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (mult E1 E2) intTy @ Ty1 : typeOf FT ET E1 intTy * Ty2 : typeOf FT ET E2 intTy * ============================ is_typ intTy
< search. Subgoal 1.5: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (div E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (div E1 E2) intTy @ Ty1 : typeOf FT ET E1 intTy * Ty2 : typeOf FT ET E2 intTy * ============================ is_typ intTy
< search. Subgoal 1.6: Variables: FT ET IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr true IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET true boolTy @ ============================ is_typ boolTy
< search. Subgoal 1.7: Variables: FT ET IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr false IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET false boolTy @ ============================ is_typ boolTy
< search. Subgoal 1.8: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (and E1 E2) boolTy @ Ty1 : typeOf FT ET E1 boolTy * Ty2 : typeOf FT ET E2 boolTy * ============================ is_typ boolTy
< search. Subgoal 1.9: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (or E1 E2) boolTy @ Ty1 : typeOf FT ET E1 boolTy * Ty2 : typeOf FT ET E2 boolTy * ============================ is_typ boolTy
< search. Subgoal 1.10: Variables: FT ET E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (not E1) boolTy @ Ty1 : typeOf FT ET E1 boolTy * ============================ is_typ boolTy
< search. Subgoal 1.11: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (greater E1 E2) boolTy @ Ty1 : typeOf FT ET E1 intTy * Ty2 : typeOf FT ET E2 intTy * ============================ is_typ boolTy
< search. Subgoal 1.12: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (eq E1 E2) boolTy @ Ty1 : typeOf FT ET E1 intTy * Ty2 : typeOf FT ET E2 intTy * ============================ is_typ boolTy
< search. Subgoal 1.13: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (eq E1 E2) boolTy @ Ty1 : typeOf FT ET E1 boolTy * Ty2 : typeOf FT ET E2 boolTy * ============================ is_typ boolTy
< search. Subgoal 1.14: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (eq E1 E2) boolTy @ Ty1 : typeOf FT ET E1 stringTy * Ty2 : typeOf FT ET E2 stringTy * ============================ is_typ boolTy
< search. Subgoal 1.15: Variables: FT ET S IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (stringLit S) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (stringLit S) stringTy @ ============================ is_typ stringTy
< search. Subgoal 1.16: Variables: FT ET E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (appString E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (appString E1 E2) stringTy @ Ty1 : typeOf FT ET E1 stringTy * Ty2 : typeOf FT ET E2 stringTy * ============================ is_typ stringTy
< search. Subgoal 1.17: Variables: FT ET Ty X IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (name X) Ty @ Ty1 : lookupScopes X ET Ty ============================ is_typ Ty
< apply lookupScopes_isTy to _ Ty1. Subgoal 1.17: Variables: FT ET Ty X IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (name X) Ty @ Ty1 : lookupScopes X ET Ty H1 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 1.18: Variables: FT ET Ty ArgTys Args Fun IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (call Fun Args) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (call Fun Args) Ty @ Ty1 : lookup FT Fun (Ty, ArgTys) Ty2 : typeOfArgs FT ET Args ArgTys * ============================ is_typ Ty
< case IsE. Subgoal 1.18: Variables: FT ET Ty ArgTys Args Fun IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (call Fun Args) Ty @ Ty1 : lookup FT Fun (Ty, ArgTys) Ty2 : typeOfArgs FT ET Args ArgTys * H1 : is_string Fun H2 : is_args Args ============================ is_typ Ty
< IsFP: apply lookup_is_value_funTyCtx to _ Ty1. Subgoal 1.18: Variables: FT ET Ty ArgTys Args Fun IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (call Fun Args) Ty @ Ty1 : lookup FT Fun (Ty, ArgTys) Ty2 : typeOfArgs FT ET Args ArgTys * H1 : is_string Fun H2 : is_args Args IsFP : is_pair is_typ (is_list is_typ) (Ty, ArgTys) ============================ is_typ Ty
< case IsFP. Subgoal 1.18: Variables: FT ET Ty ArgTys Args Fun IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (call Fun Args) Ty @ Ty1 : lookup FT Fun (Ty, ArgTys) Ty2 : typeOfArgs FT ET Args ArgTys * H1 : is_string Fun H2 : is_args Args H3 : is_typ Ty H4 : is_list is_typ ArgTys ============================ is_typ Ty
< search. Subgoal 1.19: Variables: FT ET Ty TC1 E1 S IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (stmtExpr S E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (stmtExpr S E1) Ty @ Ty1 : stmtOK FT ([]::ET) S TC1 * Ty2 : typeOf FT TC1 E1 Ty * ============================ is_typ Ty
< case IsE. Subgoal 1.19: Variables: FT ET Ty TC1 E1 S IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (stmtExpr S E1) Ty @ Ty1 : stmtOK FT ([]::ET) S TC1 * Ty2 : typeOf FT TC1 E1 Ty * H1 : is_stmt S H2 : is_expr E1 ============================ is_typ Ty
< apply IH1 to _ _ _ Ty1. Subgoal 1.19: Variables: FT ET Ty TC1 E1 S IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (stmtExpr S E1) Ty @ Ty1 : stmtOK FT ([]::ET) S TC1 * Ty2 : typeOf FT TC1 E1 Ty * H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ is_typ Ty
< apply IH to _ _ _ Ty2. Subgoal 1.19: Variables: FT ET Ty TC1 E1 S IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (stmtExpr S E1) Ty @ Ty1 : stmtOK FT ([]::ET) S TC1 * Ty2 : typeOf FT TC1 E1 Ty * H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list (is_pair is_string is_typ)) TC1 H4 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 1.20: Variables: FT ET FieldTys Fields IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (recBuild Fields) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recBuild Fields) (recTy FieldTys) @ Ty1 : typeOfRecFields FT ET Fields FieldTys * ============================ is_typ (recTy FieldTys)
< case IsE. Subgoal 1.20: Variables: FT ET FieldTys Fields IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recBuild Fields) (recTy FieldTys) @ Ty1 : typeOfRecFields FT ET Fields FieldTys * H1 : is_recFieldExprs Fields ============================ is_typ (recTy FieldTys)
< apply IH3 to _ _ _ Ty1. Subgoal 1.20: Variables: FT ET FieldTys Fields IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recBuild Fields) (recTy FieldTys) @ Ty1 : typeOfRecFields FT ET Fields FieldTys * H1 : is_recFieldExprs Fields H2 : is_recFieldTys FieldTys ============================ is_typ (recTy FieldTys)
< search. Subgoal 1.21: Variables: FT ET Ty FieldTys Field E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (recFieldAccess E1 Field) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recFieldAccess E1 Field) Ty @ Ty1 : typeOf FT ET E1 (recTy FieldTys) * Ty2 : lookupRecFieldTy FieldTys Field Ty ============================ is_typ Ty
< case IsE. Subgoal 1.21: Variables: FT ET Ty FieldTys Field E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recFieldAccess E1 Field) Ty @ Ty1 : typeOf FT ET E1 (recTy FieldTys) * Ty2 : lookupRecFieldTy FieldTys Field Ty H1 : is_expr E1 H2 : is_string Field ============================ is_typ Ty
< Is: apply IH to _ _ _ Ty1. Subgoal 1.21: Variables: FT ET Ty FieldTys Field E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recFieldAccess E1 Field) Ty @ Ty1 : typeOf FT ET E1 (recTy FieldTys) * Ty2 : lookupRecFieldTy FieldTys Field Ty H1 : is_expr E1 H2 : is_string Field Is : is_typ (recTy FieldTys) ============================ is_typ Ty
< case Is. Subgoal 1.21: Variables: FT ET Ty FieldTys Field E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recFieldAccess E1 Field) Ty @ Ty1 : typeOf FT ET E1 (recTy FieldTys) * Ty2 : lookupRecFieldTy FieldTys Field Ty H1 : is_expr E1 H2 : is_string Field H3 : is_recFieldTys FieldTys ============================ is_typ Ty
< apply lookupRecFieldTy_is to _ Ty2. Subgoal 1.21: Variables: FT ET Ty FieldTys Field E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (recFieldAccess E1 Field) Ty @ Ty1 : typeOf FT ET E1 (recTy FieldTys) * Ty2 : lookupRecFieldTy FieldTys Field Ty H1 : is_expr E1 H2 : is_string Field H3 : is_recFieldTys FieldTys H4 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 1.22: Variables: FT ET Ty Msg IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (errorExpr Msg Ty) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (errorExpr Msg Ty) Ty @ ============================ is_typ Ty
< case IsE. Subgoal 1.22: Variables: FT ET Ty Msg IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (errorExpr Msg Ty) Ty @ H1 : is_expr Msg H2 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 2.1: Variables: FT ET' IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' noop ET' @ ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.2: Variables: FT ET ET' TC1 S2 S1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (seq S1 S2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< case IsS. Subgoal 2.2: Variables: FT ET ET' TC1 S2 S1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< apply IH1 to _ _ _ Ty1. Subgoal 2.2: Variables: FT ET ET' TC1 S2 S1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< apply IH1 to _ _ _ Ty2. Subgoal 2.2: Variables: FT ET ET' TC1 S2 S1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_typ)) TC1 H4 : is_list (is_list (is_pair is_string is_typ)) ET' ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.3: Variables: FT RestTC Scope Ty X E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (declare Ty X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) Ty : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< case IsS. Subgoal 2.3: Variables: FT RestTC Scope Ty X E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) Ty : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< apply IH to _ _ _ Ty2. Subgoal 2.3: Variables: FT RestTC Scope Ty X E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) Ty : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_typ Ty ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< case IsET. Subgoal 2.3: Variables: FT RestTC Scope Ty X E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_typ Ty H5 : is_list (is_pair is_string is_typ) Scope H6 : is_list (is_list (is_pair is_string is_typ)) RestTC ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< search. Subgoal 2.4: Variables: FT ET' Ty E X IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (assign X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (assign X E) ET' @ Ty1 : lookupScopes X ET' Ty Ty2 : typeOf FT ET' E Ty * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.5: Variables: FT ET' FieldTys Ty E Fields Rec IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (recUpdate Rec Fields E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (recUpdate Rec Fields E) ET' @ Ty1 : lookupScopes Rec ET' (recTy FieldTys) Ty2 : typeOf FT ET' E Ty * Ty3 : nestedFieldTy Fields FieldTys Ty ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.6: Variables: FT ET' TCTh TCEl El Th Cond IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (ifThenElse Cond Th El) ET' @ Ty1 : typeOf FT ET' Cond boolTy * Ty2 : stmtOK FT ([]::ET') Th TCTh * Ty3 : stmtOK FT ([]::ET') El TCEl * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.7: Variables: FT ET' TC2 Body Cond IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (while Cond Body) ET' @ Ty1 : typeOf FT ET' Cond boolTy * Ty2 : stmtOK FT ([]::ET') Body TC2 * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.8: Variables: FT ET' TC2 S1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (scopeStmt S1) ET' @ Ty1 : stmtOK FT ([]::ET') S1 TC2 * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.9: Variables: FT ET' E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (printVal E) ET' @ Ty1 : typeOf FT ET' E intTy * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.10: Variables: FT ET' E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (printVal E) ET' @ Ty1 : typeOf FT ET' E boolTy * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.11: Variables: FT ET' E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (printVal E) ET' @ Ty1 : typeOf FT ET' E stringTy * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 3: Variables: A FT ET Tys IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsA : is_args A IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOfArgs FT ET A Tys @ ============================ is_list is_typ Tys
< Ty: case Ty. Subgoal 3.1: Variables: FT ET IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsA : is_args nilArgs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET ============================ is_list is_typ []
< search. Subgoal 3.2: Variables: FT ET ETys ETy Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsA : is_args (consArgs E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfArgs FT ET Rest ETys * ============================ is_list is_typ (ETy::ETys)
< case IsA. Subgoal 3.2: Variables: FT ET ETys ETy Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfArgs FT ET Rest ETys * H1 : is_expr E H2 : is_args Rest ============================ is_list is_typ (ETy::ETys)
< apply IH to _ _ _ Ty. Subgoal 3.2: Variables: FT ET ETys ETy Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfArgs FT ET Rest ETys * H1 : is_expr E H2 : is_args Rest H3 : is_typ ETy ============================ is_list is_typ (ETy::ETys)
< apply IH2 to _ _ _ Ty1. Subgoal 3.2: Variables: FT ET ETys ETy Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfArgs FT ET Rest ETys * H1 : is_expr E H2 : is_args Rest H3 : is_typ ETy H4 : is_list is_typ ETys ============================ is_list is_typ (ETy::ETys)
< search. Subgoal 4: Variables: RF FT ET Fields IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsRF : is_recFieldExprs RF IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOfRecFields FT ET RF Fields @ ============================ is_recFieldTys Fields
< Ty: case Ty. Subgoal 4.1: Variables: FT ET IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsRF : is_recFieldExprs nilRecFieldExprs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET ============================ is_recFieldTys nilRecFieldTys
< search. Subgoal 4.2: Variables: FT ET RestTys ETy Name Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsRF : is_recFieldExprs (consRecFieldExprs Name E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfRecFields FT ET Rest RestTys * ============================ is_recFieldTys (consRecFieldTys Name ETy RestTys)
< case IsRF. Subgoal 4.2: Variables: FT ET RestTys ETy Name Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfRecFields FT ET Rest RestTys * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest ============================ is_recFieldTys (consRecFieldTys Name ETy RestTys)
< apply IH to _ _ _ Ty. Subgoal 4.2: Variables: FT ET RestTys ETy Name Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfRecFields FT ET Rest RestTys * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_typ ETy ============================ is_recFieldTys (consRecFieldTys Name ETy RestTys)
< apply IH3 to _ _ _ Ty1. Subgoal 4.2: Variables: FT ET RestTys ETy Name Rest E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET E ETy * Ty1 : typeOfRecFields FT ET Rest RestTys * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_typ ETy H5 : is_recFieldTys RestTys ============================ is_recFieldTys (consRecFieldTys Name ETy RestTys)
< search. Proof completed.
< Extensible_Theorem stmtOK_keep_scopes : forall FT ET S ET' N, IsS : is_stmt S -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> Ty : stmtOK FT ET S ET' -> L : length ET N -> length ET' N on Ty. Subgoal 1: Variables: FT ET' N IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' noop ET' @ L : length ET' N ============================ length ET' N
< search. Subgoal 2: Variables: FT ET ET' N TC1 S2 S1 IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (seq S1 S2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ L : length ET N Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * ============================ length ET' N
< case IsS. Subgoal 2: Variables: FT ET ET' N TC1 S2 S1 IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ L : length ET N Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ length ET' N
< apply IH to _ _ _ Ty1 _. Subgoal 2: Variables: FT ET ET' N TC1 S2 S1 IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ L : length ET N Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : length TC1 N ============================ length ET' N
< apply stmtOK_isCtx to _ _ _ Ty1. Subgoal 2: Variables: FT ET ET' N TC1 S2 S1 IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ L : length ET N Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : length TC1 N H4 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ length ET' N
< apply IH to _ _ _ Ty2 _. Subgoal 2: Variables: FT ET ET' N TC1 S2 S1 IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : stmtOK FT ET (seq S1 S2) ET' @ L : length ET N Ty1 : stmtOK FT ET S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : length TC1 N H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : length ET' N ============================ length ET' N
< search. Subgoal 3: Variables: FT N RestTC Scope Ty X E IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (declare Ty X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) Ty : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ L : length (Scope::RestTC) N Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * ============================ length (((X, Ty)::Scope)::RestTC) N
< L: case L. Subgoal 3: Variables: FT N RestTC Scope Ty X E N' IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (declare Ty X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) Ty : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * L : length RestTC N' L1 : 1 + N' = N ============================ length (((X, Ty)::Scope)::RestTC) N
< search. Subgoal 4: Variables: FT ET' N Ty E X IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (assign X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (assign X E) ET' @ L : length ET' N Ty1 : lookupScopes X ET' Ty Ty2 : typeOf FT ET' E Ty * ============================ length ET' N
< search. Subgoal 5: Variables: FT ET' N FieldTys Ty E Fields Rec IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (recUpdate Rec Fields E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (recUpdate Rec Fields E) ET' @ L : length ET' N Ty1 : lookupScopes Rec ET' (recTy FieldTys) Ty2 : typeOf FT ET' E Ty * Ty3 : nestedFieldTy Fields FieldTys Ty ============================ length ET' N
< search. Subgoal 6: Variables: FT ET' N TCTh TCEl El Th Cond IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (ifThenElse Cond Th El) ET' @ L : length ET' N Ty1 : typeOf FT ET' Cond boolTy * Ty2 : stmtOK FT ([]::ET') Th TCTh * Ty3 : stmtOK FT ([]::ET') El TCEl * ============================ length ET' N
< search. Subgoal 7: Variables: FT ET' N TC2 Body Cond IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (while Cond Body) ET' @ L : length ET' N Ty1 : typeOf FT ET' Cond boolTy * Ty2 : stmtOK FT ([]::ET') Body TC2 * ============================ length ET' N
< search. Subgoal 8: Variables: FT ET' N TC2 S1 IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (scopeStmt S1) ET' @ L : length ET' N Ty1 : stmtOK FT ([]::ET') S1 TC2 * ============================ length ET' N
< search. Subgoal 9: Variables: FT ET' N E IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (printVal E) ET' @ L : length ET' N Ty1 : typeOf FT ET' E intTy * ============================ length ET' N
< search. Subgoal 10: Variables: FT ET' N E IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (printVal E) ET' @ L : length ET' N Ty1 : typeOf FT ET' E boolTy * ============================ length ET' N
< search. Subgoal 11: Variables: FT ET' N E IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (printVal E) ET' @ L : length ET' N Ty1 : typeOf FT ET' E stringTy * ============================ length ET' N
< search. Proof completed.
< Extensible_Theorem stmtOK_older_scopes_same : forall FT ET S ET' Scope, IsS : is_stmt S -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> Ty : stmtOK FT (Scope::ET) S ET' -> exists Scope', ET' = Scope'::ET on Ty. Subgoal 1: Variables: FT ET Scope IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) noop (Scope::ET) @ ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 2: Variables: FT ET ET' Scope TC1 S2 S1 IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (seq S1 S2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) ET' @ Ty1 : stmtOK FT (Scope::ET) S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * ============================ exists Scope', ET' = Scope'::ET
< case IsS. Subgoal 2: Variables: FT ET ET' Scope TC1 S2 S1 IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) ET' @ Ty1 : stmtOK FT (Scope::ET) S1 TC1 * Ty2 : stmtOK FT TC1 S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists Scope', ET' = Scope'::ET
< apply IH to _ _ _ Ty1. Subgoal 2: Variables: FT ET ET' Scope S2 S1 Scope' IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) ET' @ Ty1 : stmtOK FT (Scope::ET) S1 (Scope'::ET) * Ty2 : stmtOK FT (Scope'::ET) S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists Scope', ET' = Scope'::ET
< apply stmtOK_isCtx to _ _ _ Ty1. Subgoal 2: Variables: FT ET ET' Scope S2 S1 Scope' IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) ET' @ Ty1 : stmtOK FT (Scope::ET) S1 (Scope'::ET) * Ty2 : stmtOK FT (Scope'::ET) S2 ET' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) ============================ exists Scope', ET' = Scope'::ET
< apply IH to _ _ _ Ty2. Subgoal 2: Variables: FT ET Scope S2 S1 Scope' Scope'1 IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'1::ET) @ Ty1 : stmtOK FT (Scope::ET) S1 (Scope'::ET) * Ty2 : stmtOK FT (Scope'::ET) S2 (Scope'1::ET) * H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) ============================ exists Scope', Scope'1::ET = Scope'::ET
< search. Subgoal 3: Variables: FT ET Scope Ty X E IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (declare Ty X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (declare Ty X E) (((X, Ty)::Scope)::ET) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::ET) E Ty * ============================ exists Scope', ((X, Ty)::Scope)::ET = Scope'::ET
< search. Subgoal 4: Variables: FT ET Scope Ty E X IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (assign X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (assign X E) (Scope::ET) @ Ty1 : lookupScopes X (Scope::ET) Ty Ty2 : typeOf FT (Scope::ET) E Ty * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 5: Variables: FT ET Scope FieldTys Ty E Fields Rec IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (recUpdate Rec Fields E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (recUpdate Rec Fields E) (Scope::ET) @ Ty1 : lookupScopes Rec (Scope::ET) (recTy FieldTys) Ty2 : typeOf FT (Scope::ET) E Ty * Ty3 : nestedFieldTy Fields FieldTys Ty ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 6: Variables: FT ET Scope TCTh TCEl El Th Cond IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (ifThenElse Cond Th El) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) Cond boolTy * Ty2 : stmtOK FT ([]::(Scope::ET)) Th TCTh * Ty3 : stmtOK FT ([]::(Scope::ET)) El TCEl * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 7: Variables: FT ET Scope TC2 Body Cond IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (while Cond Body) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) Cond boolTy * Ty2 : stmtOK FT ([]::(Scope::ET)) Body TC2 * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 8: Variables: FT ET Scope TC2 S1 IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (scopeStmt S1) (Scope::ET) @ Ty1 : stmtOK FT ([]::(Scope::ET)) S1 TC2 * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 9: Variables: FT ET Scope E IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (printVal E) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) E intTy * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 10: Variables: FT ET Scope E IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (printVal E) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) E boolTy * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 11: Variables: FT ET Scope E IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (printVal E) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) E stringTy * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Proof completed.
< Extensible_Theorem stmtOK_first_scope_lookup_same : forall FT ET S Scope Scope' X Ty, IsS : is_stmt S -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> Ty : stmtOK FT (Scope::ET) S (Scope'::ET) -> L : lookup Scope X Ty -> lookup Scope' X Ty on Ty. Subgoal 1: Variables: FT ET Scope' X Ty IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) noop (Scope'::ET) @ L : lookup Scope' X Ty ============================ lookup Scope' X Ty
< search. Subgoal 2: Variables: FT ET Scope Scope' X Ty TC1 S2 S1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (seq S1 S2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 TC1 * Ty2 : stmtOK FT TC1 S2 (Scope'::ET) * ============================ lookup Scope' X Ty
< case IsS. Subgoal 2: Variables: FT ET Scope Scope' X Ty TC1 S2 S1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 TC1 * Ty2 : stmtOK FT TC1 S2 (Scope'::ET) * H1 : is_stmt S1 H2 : is_stmt S2 ============================ lookup Scope' X Ty
< apply stmtOK_older_scopes_same to _ _ _ Ty1. Subgoal 2: Variables: FT ET Scope Scope' X Ty S2 S1 Scope'1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 (Scope'1::ET) * Ty2 : stmtOK FT (Scope'1::ET) S2 (Scope'::ET) * H1 : is_stmt S1 H2 : is_stmt S2 ============================ lookup Scope' X Ty
< L': apply IH to _ _ _ Ty1 L. Subgoal 2: Variables: FT ET Scope Scope' X Ty S2 S1 Scope'1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 (Scope'1::ET) * Ty2 : stmtOK FT (Scope'1::ET) S2 (Scope'::ET) * H1 : is_stmt S1 H2 : is_stmt S2 L' : lookup Scope'1 X Ty ============================ lookup Scope' X Ty
< apply stmtOK_isCtx to _ _ _ Ty1. Subgoal 2: Variables: FT ET Scope Scope' X Ty S2 S1 Scope'1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 (Scope'1::ET) * Ty2 : stmtOK FT (Scope'1::ET) S2 (Scope'::ET) * H1 : is_stmt S1 H2 : is_stmt S2 L' : lookup Scope'1 X Ty H3 : is_list (is_list (is_pair is_string is_typ)) (Scope'1::ET) ============================ lookup Scope' X Ty
< apply stmtOK_older_scopes_same to _ _ _ Ty2. Subgoal 2: Variables: FT ET Scope X Ty S2 S1 Scope'1 Scope'2 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'2::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 (Scope'1::ET) * Ty2 : stmtOK FT (Scope'1::ET) S2 (Scope'2::ET) * H1 : is_stmt S1 H2 : is_stmt S2 L' : lookup Scope'1 X Ty H3 : is_list (is_list (is_pair is_string is_typ)) (Scope'1::ET) ============================ lookup Scope'2 X Ty
< apply IH to _ _ _ Ty2 L'. Subgoal 2: Variables: FT ET Scope X Ty S2 S1 Scope'1 Scope'2 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (seq S1 S2) (Scope'2::ET) @ L : lookup Scope X Ty Ty1 : stmtOK FT (Scope::ET) S1 (Scope'1::ET) * Ty2 : stmtOK FT (Scope'1::ET) S2 (Scope'2::ET) * H1 : is_stmt S1 H2 : is_stmt S2 L' : lookup Scope'1 X Ty H3 : is_list (is_list (is_pair is_string is_typ)) (Scope'1::ET) H4 : lookup Scope'2 X Ty ============================ lookup Scope'2 X Ty
< search. Subgoal 3: Variables: FT ET Scope X Ty Ty1 X1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (declare Ty1 X1 E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (declare Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * ============================ lookup ((X1, Ty1)::Scope) X Ty
< Is: case IsS. Subgoal 3: Variables: FT ET Scope X Ty Ty1 X1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (declare Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * Is : is_typ Ty1 Is1 : is_string X1 Is2 : is_expr E ============================ lookup ((X1, Ty1)::Scope) X Ty
< case IsET. Subgoal 3: Variables: FT ET Scope X Ty Ty1 X1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::ET) (declare Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * Is : is_typ Ty1 Is1 : is_string X1 Is2 : is_expr E H1 : is_list (is_pair is_string is_typ) Scope H2 : is_list (is_list (is_pair is_string is_typ)) ET ============================ lookup ((X1, Ty1)::Scope) X Ty
< Is': apply lookup_is_key_type to _ L. Subgoal 3: Variables: FT ET Scope X Ty Ty1 X1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::ET) (declare Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * Is : is_typ Ty1 Is1 : is_string X1 Is2 : is_expr E H1 : is_list (is_pair is_string is_typ) Scope H2 : is_list (is_list (is_pair is_string is_typ)) ET Is' : is_string X ============================ lookup ((X1, Ty1)::Scope) X Ty
< Or: apply is_string_eq_or_not to Is1 Is'. Subgoal 3: Variables: FT ET Scope X Ty Ty1 X1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::ET) (declare Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * Is : is_typ Ty1 Is1 : is_string X1 Is2 : is_expr E H1 : is_list (is_pair is_string is_typ) Scope H2 : is_list (is_list (is_pair is_string is_typ)) ET Is' : is_string X Or : X1 = X \/ (X1 = X -> false) ============================ lookup ((X1, Ty1)::Scope) X Ty
< E: case Or. Subgoal 3.1: Variables: FT ET Scope X Ty Ty1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::ET) (declare Ty1 X E) (((X, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::ET) E Ty1 * Is : is_typ Ty1 Is1 : is_string X Is2 : is_expr E H1 : is_list (is_pair is_string is_typ) Scope H2 : is_list (is_list (is_pair is_string is_typ)) ET Is' : is_string X ============================ lookup ((X, Ty1)::Scope) X Ty
< apply no_lookup to Ty1 L. Subgoal 3.2: Variables: FT ET Scope X Ty Ty1 X1 E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::ET) (declare Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * Is : is_typ Ty1 Is1 : is_string X1 Is2 : is_expr E H1 : is_list (is_pair is_string is_typ) Scope H2 : is_list (is_list (is_pair is_string is_typ)) ET Is' : is_string X E : X1 = X -> false ============================ lookup ((X1, Ty1)::Scope) X Ty
< search. Subgoal 4: Variables: FT ET Scope' X Ty Ty1 E X1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (assign X1 E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (assign X1 E) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : lookupScopes X1 (Scope'::ET) Ty1 Ty2 : typeOf FT (Scope'::ET) E Ty1 * ============================ lookup Scope' X Ty
< search. Subgoal 5: Variables: FT ET Scope' X Ty FieldTys Ty1 E Fields Rec IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (recUpdate Rec Fields E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (recUpdate Rec Fields E) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : lookupScopes Rec (Scope'::ET) (recTy FieldTys) Ty2 : typeOf FT (Scope'::ET) E Ty1 * Ty3 : nestedFieldTy Fields FieldTys Ty1 ============================ lookup Scope' X Ty
< search. Subgoal 6: Variables: FT ET Scope' X Ty TCTh TCEl El Th Cond IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (ifThenElse Cond Th El) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) Cond boolTy * Ty2 : stmtOK FT ([]::(Scope'::ET)) Th TCTh * Ty3 : stmtOK FT ([]::(Scope'::ET)) El TCEl * ============================ lookup Scope' X Ty
< search. Subgoal 7: Variables: FT ET Scope' X Ty TC2 Body Cond IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (while Cond Body) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) Cond boolTy * Ty2 : stmtOK FT ([]::(Scope'::ET)) Body TC2 * ============================ lookup Scope' X Ty
< search. Subgoal 8: Variables: FT ET Scope' X Ty TC2 S1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (scopeStmt S1) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : stmtOK FT ([]::(Scope'::ET)) S1 TC2 * ============================ lookup Scope' X Ty
< search. Subgoal 9: Variables: FT ET Scope' X Ty E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (printVal E) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) E intTy * ============================ lookup Scope' X Ty
< search. Subgoal 10: Variables: FT ET Scope' X Ty E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (printVal E) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) E boolTy * ============================ lookup Scope' X Ty
< search. Subgoal 11: Variables: FT ET Scope' X Ty E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (printVal E) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) E stringTy * ============================ lookup Scope' X Ty
< search. Proof completed.
< Extensible_Theorem typeOf_unique : forall FT ET_A ET_B E TyA TyB, IsE : is_expr E -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsA : is_list (is_list (is_pair is_string is_typ)) ET_A -> IsB : is_list (is_list (is_pair is_string is_typ)) ET_B -> TyA : typeOf FT ET_A E TyA -> TyB : typeOf FT ET_B E TyB -> Lkp : lookup_all_scopes ET_A ET_B -> TyA = TyB on TyA as IH_E, stmtOK_unique : forall FT ET_A ET_B S ET_A' ET_B', IsS : is_stmt S -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsA : is_list (is_list (is_pair is_string is_typ)) ET_A -> IsB : is_list (is_list (is_pair is_string is_typ)) ET_B -> TyA : stmtOK FT ET_A S ET_A' -> TyB : stmtOK FT ET_B S ET_B' -> Lkp : lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' on TyA as IH_Salso typeOfArgs_unique : forall FT ET_A ET_B A TysA TysB, IsA : is_args A -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsA : is_list (is_list (is_pair is_string is_typ)) ET_A -> IsB : is_list (is_list (is_pair is_string is_typ)) ET_B -> TyA : typeOfArgs FT ET_A A TysA -> TyB : typeOfArgs FT ET_B A TysB -> Lkp : lookup_all_scopes ET_A ET_B -> TysA = TysB on TyA as IH_A, typeOfRecFields_unique : forall FT ET_A ET_B RF FieldsA FieldsB, IsRF : is_recFieldExprs RF -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsA : is_list (is_list (is_pair is_string is_typ)) ET_A -> IsB : is_list (is_list (is_pair is_string is_typ)) ET_B -> TyA : typeOfRecFields FT ET_A RF FieldsA -> TyB : typeOfRecFields FT ET_B RF FieldsB -> Lkp : lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB on TyA as IH_RF. Subgoal 1.1: Variables: FT ET_A ET_B TyB I IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (num I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (num I) intTy @ TyB : typeOf FT ET_B (num I) TyB Lkp : lookup_all_scopes ET_A ET_B ============================ intTy = TyB
< case TyB. Subgoal 1.1: Variables: FT ET_A ET_B I IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (num I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (num I) intTy @ Lkp : lookup_all_scopes ET_A ET_B ============================ intTy = intTy
< search. Subgoal 1.2: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (plus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (plus E1 E2) intTy @ TyB : typeOf FT ET_B (plus E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * ============================ intTy = TyB
< case TyB. Subgoal 1.2: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (plus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (plus E1 E2) intTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ intTy = intTy
< search. Subgoal 1.3: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (minus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (minus E1 E2) intTy @ TyB : typeOf FT ET_B (minus E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * ============================ intTy = TyB
< case TyB. Subgoal 1.3: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (minus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (minus E1 E2) intTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ intTy = intTy
< search. Subgoal 1.4: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (mult E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (mult E1 E2) intTy @ TyB : typeOf FT ET_B (mult E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * ============================ intTy = TyB
< case TyB. Subgoal 1.4: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (mult E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (mult E1 E2) intTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ intTy = intTy
< search. Subgoal 1.5: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (div E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (div E1 E2) intTy @ TyB : typeOf FT ET_B (div E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * ============================ intTy = TyB
< case TyB. Subgoal 1.5: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (div E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (div E1 E2) intTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ intTy = intTy
< search. Subgoal 1.6: Variables: FT ET_A ET_B TyB IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr true IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A true boolTy @ TyB : typeOf FT ET_B true TyB Lkp : lookup_all_scopes ET_A ET_B ============================ boolTy = TyB
< case TyB. Subgoal 1.6: Variables: FT ET_A ET_B IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr true IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A true boolTy @ Lkp : lookup_all_scopes ET_A ET_B ============================ boolTy = boolTy
< search. Subgoal 1.7: Variables: FT ET_A ET_B TyB IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr false IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A false boolTy @ TyB : typeOf FT ET_B false TyB Lkp : lookup_all_scopes ET_A ET_B ============================ boolTy = TyB
< case TyB. Subgoal 1.7: Variables: FT ET_A ET_B IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr false IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A false boolTy @ Lkp : lookup_all_scopes ET_A ET_B ============================ boolTy = boolTy
< search. Subgoal 1.8: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (and E1 E2) boolTy @ TyB : typeOf FT ET_B (and E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.8: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (and E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * H1 : typeOf FT ET_B E1 boolTy H2 : typeOf FT ET_B E2 boolTy ============================ boolTy = boolTy
< search. Subgoal 1.9: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (or E1 E2) boolTy @ TyB : typeOf FT ET_B (or E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.9: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (or E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * H1 : typeOf FT ET_B E1 boolTy H2 : typeOf FT ET_B E2 boolTy ============================ boolTy = boolTy
< search. Subgoal 1.10: Variables: FT ET_A ET_B TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (not E1) boolTy @ TyB : typeOf FT ET_B (not E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.10: Variables: FT ET_A ET_B E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (not E1) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * H1 : typeOf FT ET_B E1 boolTy ============================ boolTy = boolTy
< search. Subgoal 1.11: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (greater E1 E2) boolTy @ TyB : typeOf FT ET_B (greater E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.11: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (greater E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ boolTy = boolTy
< search. Subgoal 1.12: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ TyB : typeOf FT ET_B (eq E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.12.1: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ boolTy = boolTy
< search. Subgoal 1.12.2: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 boolTy H2 : typeOf FT ET_B E2 boolTy ============================ boolTy = boolTy
< search. Subgoal 1.12.3: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 intTy * TyA2 : typeOf FT ET_A E2 intTy * H1 : typeOf FT ET_B E1 stringTy H2 : typeOf FT ET_B E2 stringTy ============================ boolTy = boolTy
< search. Subgoal 1.13: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ TyB : typeOf FT ET_B (eq E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.13.1: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ boolTy = boolTy
< search. Subgoal 1.13.2: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * H1 : typeOf FT ET_B E1 boolTy H2 : typeOf FT ET_B E2 boolTy ============================ boolTy = boolTy
< search. Subgoal 1.13.3: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 boolTy * TyA2 : typeOf FT ET_A E2 boolTy * H1 : typeOf FT ET_B E1 stringTy H2 : typeOf FT ET_B E2 stringTy ============================ boolTy = boolTy
< search. Subgoal 1.14: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ TyB : typeOf FT ET_B (eq E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 stringTy * TyA2 : typeOf FT ET_A E2 stringTy * ============================ boolTy = TyB
< case TyB. Subgoal 1.14.1: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 stringTy * TyA2 : typeOf FT ET_A E2 stringTy * H1 : typeOf FT ET_B E1 intTy H2 : typeOf FT ET_B E2 intTy ============================ boolTy = boolTy
< search. Subgoal 1.14.2: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 stringTy * TyA2 : typeOf FT ET_A E2 stringTy * H1 : typeOf FT ET_B E1 boolTy H2 : typeOf FT ET_B E2 boolTy ============================ boolTy = boolTy
< search. Subgoal 1.14.3: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (eq E1 E2) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 stringTy * TyA2 : typeOf FT ET_A E2 stringTy * H1 : typeOf FT ET_B E1 stringTy H2 : typeOf FT ET_B E2 stringTy ============================ boolTy = boolTy
< search. Subgoal 1.15: Variables: FT ET_A ET_B TyB S IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (stringLit S) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stringLit S) stringTy @ TyB : typeOf FT ET_B (stringLit S) TyB Lkp : lookup_all_scopes ET_A ET_B ============================ stringTy = TyB
< case TyB. Subgoal 1.15: Variables: FT ET_A ET_B S IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (stringLit S) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stringLit S) stringTy @ Lkp : lookup_all_scopes ET_A ET_B ============================ stringTy = stringTy
< search. Subgoal 1.16: Variables: FT ET_A ET_B TyB E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (appString E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (appString E1 E2) stringTy @ TyB : typeOf FT ET_B (appString E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 stringTy * TyA2 : typeOf FT ET_A E2 stringTy * ============================ stringTy = TyB
< case TyB. Subgoal 1.16: Variables: FT ET_A ET_B E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (appString E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (appString E1 E2) stringTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 stringTy * TyA2 : typeOf FT ET_A E2 stringTy * H1 : typeOf FT ET_B E1 stringTy H2 : typeOf FT ET_B E2 stringTy ============================ stringTy = stringTy
< search. Subgoal 1.17: Variables: FT ET_A ET_B TyA TyB X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (name X) TyA @ TyB : typeOf FT ET_B (name X) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookupScopes X ET_A TyA ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.17: Variables: FT ET_A ET_B TyA TyB X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (name X) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookupScopes X ET_A TyA TyB : lookupScopes X ET_B TyB ============================ TyA = TyB
< case IsE. Subgoal 1.17: Variables: FT ET_A ET_B TyA TyB X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (name X) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookupScopes X ET_A TyA TyB : lookupScopes X ET_B TyB H1 : is_string X ============================ TyA = TyB
< L: apply lookup_all_scopes_lookupScopes to _ Lkp TyA1. Subgoal 1.17: Variables: FT ET_A ET_B TyA TyB X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (name X) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookupScopes X ET_A TyA TyB : lookupScopes X ET_B TyB H1 : is_string X L : lookupScopes X ET_B TyA ============================ TyA = TyB
< apply lookupScopes_unique to L TyB. Subgoal 1.17: Variables: FT ET_A ET_B TyB X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (name X) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookupScopes X ET_A TyB TyB : lookupScopes X ET_B TyB H1 : is_string X L : lookupScopes X ET_B TyB ============================ TyB = TyB
< search. Subgoal 1.18: Variables: FT ET_A ET_B TyA TyB ArgTys Args Fun IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (call Fun Args) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (call Fun Args) TyA @ TyB : typeOf FT ET_B (call Fun Args) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookup FT Fun (TyA, ArgTys) TyA2 : typeOfArgs FT ET_A Args ArgTys * ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.18: Variables: FT ET_A ET_B TyA TyB ArgTys Args Fun ArgTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (call Fun Args) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (call Fun Args) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookup FT Fun (TyA, ArgTys) TyA2 : typeOfArgs FT ET_A Args ArgTys * TyB : lookup FT Fun (TyB, ArgTys1) TyB1 : typeOfArgs FT ET_B Args ArgTys1 ============================ TyA = TyB
< apply lookup_unique to TyA1 TyB. Subgoal 1.18: Variables: FT ET_A ET_B TyB Args Fun ArgTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (call Fun Args) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (call Fun Args) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : lookup FT Fun (TyB, ArgTys1) TyA2 : typeOfArgs FT ET_A Args ArgTys1 * TyB : lookup FT Fun (TyB, ArgTys1) TyB1 : typeOfArgs FT ET_B Args ArgTys1 ============================ TyB = TyB
< search. Subgoal 1.19: Variables: FT ET_A ET_B TyA TyB TC1 E1 S IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (stmtExpr S E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyA @ TyB : typeOf FT ET_B (stmtExpr S E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyA * ============================ TyA = TyB
< case IsE. Subgoal 1.19: Variables: FT ET_A ET_B TyA TyB TC1 E1 S IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyA @ TyB : typeOf FT ET_B (stmtExpr S E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyA * H1 : is_stmt S H2 : is_expr E1 ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.19: Variables: FT ET_A ET_B TyA TyB TC1 E1 S TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyA * H1 : is_stmt S H2 : is_expr E1 TyB : stmtOK FT ([]::ET_B) S TC2 TyB1 : typeOf FT TC2 E1 TyB ============================ TyA = TyB
< apply IH_S to _ _ _ _ TyA1 TyB _. Subgoal 1.19: Variables: FT ET_A ET_B TyA TyB TC1 E1 S TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyA * H1 : is_stmt S H2 : is_expr E1 TyB : stmtOK FT ([]::ET_B) S TC2 TyB1 : typeOf FT TC2 E1 TyB H3 : lookup_all_scopes TC1 TC2 ============================ TyA = TyB
< apply stmtOK_isCtx to _ _ _ TyA1. Subgoal 1.19: Variables: FT ET_A ET_B TyA TyB TC1 E1 S TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyA * H1 : is_stmt S H2 : is_expr E1 TyB : stmtOK FT ([]::ET_B) S TC2 TyB1 : typeOf FT TC2 E1 TyB H3 : lookup_all_scopes TC1 TC2 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ TyA = TyB
< apply stmtOK_isCtx to _ _ _ TyB. Subgoal 1.19: Variables: FT ET_A ET_B TyA TyB TC1 E1 S TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyA * H1 : is_stmt S H2 : is_expr E1 TyB : stmtOK FT ([]::ET_B) S TC2 TyB1 : typeOf FT TC2 E1 TyB H3 : lookup_all_scopes TC1 TC2 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : is_list (is_list (is_pair is_string is_typ)) TC2 ============================ TyA = TyB
< apply IH_E to _ _ _ _ TyA2 TyB1 _. Subgoal 1.19: Variables: FT ET_A ET_B TyB TC1 E1 S TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (stmtExpr S E1) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ([]::ET_A) S TC1 * TyA2 : typeOf FT TC1 E1 TyB * H1 : is_stmt S H2 : is_expr E1 TyB : stmtOK FT ([]::ET_B) S TC2 TyB1 : typeOf FT TC2 E1 TyB H3 : lookup_all_scopes TC1 TC2 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : is_list (is_list (is_pair is_string is_typ)) TC2 ============================ TyB = TyB
< search. Subgoal 1.20: Variables: FT ET_A ET_B TyB FieldTys Fields IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (recBuild Fields) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recBuild Fields) (recTy FieldTys) @ TyB : typeOf FT ET_B (recBuild Fields) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOfRecFields FT ET_A Fields FieldTys * ============================ recTy FieldTys = TyB
< case IsE. Subgoal 1.20: Variables: FT ET_A ET_B TyB FieldTys Fields IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recBuild Fields) (recTy FieldTys) @ TyB : typeOf FT ET_B (recBuild Fields) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOfRecFields FT ET_A Fields FieldTys * H1 : is_recFieldExprs Fields ============================ recTy FieldTys = TyB
< TyB: case TyB. Subgoal 1.20: Variables: FT ET_A ET_B FieldTys Fields FieldTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recBuild Fields) (recTy FieldTys) @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOfRecFields FT ET_A Fields FieldTys * H1 : is_recFieldExprs Fields TyB : typeOfRecFields FT ET_B Fields FieldTys1 ============================ recTy FieldTys = recTy FieldTys1
< apply IH_RF to _ _ _ _ TyA1 TyB _. Subgoal 1.20: Variables: FT ET_A ET_B Fields FieldTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recBuild Fields) (recTy FieldTys1) @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOfRecFields FT ET_A Fields FieldTys1 * H1 : is_recFieldExprs Fields TyB : typeOfRecFields FT ET_B Fields FieldTys1 ============================ recTy FieldTys1 = recTy FieldTys1
< search. Subgoal 1.21: Variables: FT ET_A ET_B TyA TyB FieldTys Field E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (recFieldAccess E1 Field) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recFieldAccess E1 Field) TyA @ TyB : typeOf FT ET_B (recFieldAccess E1 Field) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (recTy FieldTys) * TyA2 : lookupRecFieldTy FieldTys Field TyA ============================ TyA = TyB
< case IsE. Subgoal 1.21: Variables: FT ET_A ET_B TyA TyB FieldTys Field E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recFieldAccess E1 Field) TyA @ TyB : typeOf FT ET_B (recFieldAccess E1 Field) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (recTy FieldTys) * TyA2 : lookupRecFieldTy FieldTys Field TyA H1 : is_expr E1 H2 : is_string Field ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.21: Variables: FT ET_A ET_B TyA TyB FieldTys Field E1 FieldTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recFieldAccess E1 Field) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (recTy FieldTys) * TyA2 : lookupRecFieldTy FieldTys Field TyA H1 : is_expr E1 H2 : is_string Field TyB : typeOf FT ET_B E1 (recTy FieldTys1) TyB1 : lookupRecFieldTy FieldTys1 Field TyB ============================ TyA = TyB
< apply IH_E to _ _ _ _ TyA1 TyB _. Subgoal 1.21: Variables: FT ET_A ET_B TyA TyB Field E1 FieldTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recFieldAccess E1 Field) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (recTy FieldTys1) * TyA2 : lookupRecFieldTy FieldTys1 Field TyA H1 : is_expr E1 H2 : is_string Field TyB : typeOf FT ET_B E1 (recTy FieldTys1) TyB1 : lookupRecFieldTy FieldTys1 Field TyB ============================ TyA = TyB
< apply lookupRecFieldTy_unique to TyA2 TyB1. Subgoal 1.21: Variables: FT ET_A ET_B TyB Field E1 FieldTys1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (recFieldAccess E1 Field) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (recTy FieldTys1) * TyA2 : lookupRecFieldTy FieldTys1 Field TyB H1 : is_expr E1 H2 : is_string Field TyB : typeOf FT ET_B E1 (recTy FieldTys1) TyB1 : lookupRecFieldTy FieldTys1 Field TyB ============================ TyB = TyB
< search. Subgoal 1.22: Variables: FT ET_A ET_B TyA TyB Msg IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (errorExpr Msg TyA) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (errorExpr Msg TyA) TyA @ TyB : typeOf FT ET_B (errorExpr Msg TyA) TyB Lkp : lookup_all_scopes ET_A ET_B ============================ TyA = TyB
< case TyB. Subgoal 1.22: Variables: FT ET_A ET_B TyB Msg IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (errorExpr Msg TyB) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (errorExpr Msg TyB) TyB @ Lkp : lookup_all_scopes ET_A ET_B ============================ TyB = TyB
< search. Subgoal 2.1: Variables: FT ET_B ET_A' ET_B' IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' noop ET_A' @ TyB : stmtOK FT ET_B noop ET_B' Lkp : lookup_all_scopes ET_A' ET_B ============================ lookup_all_scopes ET_A' ET_B'
< case TyB. Subgoal 2.1: Variables: FT ET_A' ET_B' IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' noop ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (seq S1 S2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ TyB : stmtOK FT ET_B (seq S1 S2) ET_B' Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * ============================ lookup_all_scopes ET_A' ET_B'
< case IsS. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ TyB : stmtOK FT ET_B (seq S1 S2) ET_B' Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * H1 : is_stmt S1 H2 : is_stmt S2 TyB : stmtOK FT ET_B S1 TC2 TyB1 : stmtOK FT TC2 S2 ET_B' ============================ lookup_all_scopes ET_A' ET_B'
< apply IH_S to _ _ _ _ TyA1 TyB _. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * H1 : is_stmt S1 H2 : is_stmt S2 TyB : stmtOK FT ET_B S1 TC2 TyB1 : stmtOK FT TC2 S2 ET_B' H3 : lookup_all_scopes TC1 TC2 ============================ lookup_all_scopes ET_A' ET_B'
< apply stmtOK_isCtx to _ _ _ TyA1. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * H1 : is_stmt S1 H2 : is_stmt S2 TyB : stmtOK FT ET_B S1 TC2 TyB1 : stmtOK FT TC2 S2 ET_B' H3 : lookup_all_scopes TC1 TC2 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ lookup_all_scopes ET_A' ET_B'
< apply stmtOK_isCtx to _ _ _ TyB. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * H1 : is_stmt S1 H2 : is_stmt S2 TyB : stmtOK FT ET_B S1 TC2 TyB1 : stmtOK FT TC2 S2 ET_B' H3 : lookup_all_scopes TC1 TC2 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : is_list (is_list (is_pair is_string is_typ)) TC2 ============================ lookup_all_scopes ET_A' ET_B'
< apply IH_S to _ _ _ _ TyA2 TyB1 _. Subgoal 2.2: Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A (seq S1 S2) ET_A' @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : stmtOK FT ET_A S1 TC1 * TyA2 : stmtOK FT TC1 S2 ET_A' * H1 : is_stmt S1 H2 : is_stmt S2 TyB : stmtOK FT ET_B S1 TC2 TyB1 : stmtOK FT TC2 S2 ET_B' H3 : lookup_all_scopes TC1 TC2 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : is_list (is_list (is_pair is_string is_typ)) TC2 H6 : lookup_all_scopes ET_A' ET_B' ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.3: Variables: FT ET_B ET_B' RestTC Scope Ty X E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (declare Ty X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ TyB : stmtOK FT ET_B (declare Ty X E) ET_B' Lkp : lookup_all_scopes (Scope::RestTC) ET_B TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) ET_B'
< case IsS. Subgoal 2.3: Variables: FT ET_B ET_B' RestTC Scope Ty X E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ TyB : stmtOK FT ET_B (declare Ty X E) ET_B' Lkp : lookup_all_scopes (Scope::RestTC) ET_B TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) ET_B'
< TyB: case TyB. Subgoal 2.3: Variables: FT RestTC Scope Ty X E RestTC1 Scope1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Lkp : lookup_all_scopes (Scope::RestTC) (Scope1::RestTC1) TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_typ Ty H2 : is_string X H3 : is_expr E TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) (((X, Ty)::Scope1)::RestTC1)
< apply IH_E to _ _ _ _ TyA2 TyB1 _. Subgoal 2.3: Variables: FT RestTC Scope Ty X E RestTC1 Scope1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (declare Ty X E) (((X, Ty)::Scope)::RestTC) @ Lkp : lookup_all_scopes (Scope::RestTC) (Scope1::RestTC1) TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_typ Ty H2 : is_string X H3 : is_expr E TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) (((X, Ty)::Scope1)::RestTC1)
< backchain lookup_all_scopes_add. Subgoal 2.4: Variables: FT ET_B ET_A' ET_B' Ty E X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (assign X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (assign X E) ET_A' @ TyB : stmtOK FT ET_B (assign X E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : lookupScopes X ET_A' Ty TyA2 : typeOf FT ET_A' E Ty * ============================ lookup_all_scopes ET_A' ET_B'
< case TyB. Subgoal 2.4: Variables: FT ET_A' ET_B' Ty E X Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (assign X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (assign X E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : lookupScopes X ET_A' Ty TyA2 : typeOf FT ET_A' E Ty * H1 : lookupScopes X ET_B' Ty1 H2 : typeOf FT ET_B' E Ty1 ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.5: Variables: FT ET_B ET_A' ET_B' FieldTys Ty E Fields Rec IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (recUpdate Rec Fields E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (recUpdate Rec Fields E) ET_A' @ TyB : stmtOK FT ET_B (recUpdate Rec Fields E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : lookupScopes Rec ET_A' (recTy FieldTys) TyA2 : typeOf FT ET_A' E Ty * TyA3 : nestedFieldTy Fields FieldTys Ty ============================ lookup_all_scopes ET_A' ET_B'
< case IsS. Subgoal 2.5: Variables: FT ET_B ET_A' ET_B' FieldTys Ty E Fields Rec IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (recUpdate Rec Fields E) ET_A' @ TyB : stmtOK FT ET_B (recUpdate Rec Fields E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : lookupScopes Rec ET_A' (recTy FieldTys) TyA2 : typeOf FT ET_A' E Ty * TyA3 : nestedFieldTy Fields FieldTys Ty H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.5: Variables: FT ET_A' ET_B' FieldTys Ty E Fields Rec FieldTys1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (recUpdate Rec Fields E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : lookupScopes Rec ET_A' (recTy FieldTys) TyA2 : typeOf FT ET_A' E Ty * TyA3 : nestedFieldTy Fields FieldTys Ty H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E TyB : lookupScopes Rec ET_B' (recTy FieldTys1) TyB1 : typeOf FT ET_B' E Ty1 TyB2 : nestedFieldTy Fields FieldTys1 Ty1 ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.6: Variables: FT ET_B ET_A' ET_B' TCTh TCEl El Th Cond IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (ifThenElse Cond Th El) ET_A' @ TyB : stmtOK FT ET_B (ifThenElse Cond Th El) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' Cond boolTy * TyA2 : stmtOK FT ([]::ET_A') Th TCTh * TyA3 : stmtOK FT ([]::ET_A') El TCEl * ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.6: Variables: FT ET_A' ET_B' TCTh TCEl El Th Cond TCTh1 TCEl1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (ifThenElse Cond Th El) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' Cond boolTy * TyA2 : stmtOK FT ([]::ET_A') Th TCTh * TyA3 : stmtOK FT ([]::ET_A') El TCEl * TyB : typeOf FT ET_B' Cond boolTy TyB1 : stmtOK FT ([]::ET_B') Th TCTh1 TyB2 : stmtOK FT ([]::ET_B') El TCEl1 ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.7: Variables: FT ET_B ET_A' ET_B' TC2 Body Cond IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (while Cond Body) ET_A' @ TyB : stmtOK FT ET_B (while Cond Body) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' Cond boolTy * TyA2 : stmtOK FT ([]::ET_A') Body TC2 * ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.7: Variables: FT ET_A' ET_B' TC2 Body Cond TC1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (while Cond Body) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' Cond boolTy * TyA2 : stmtOK FT ([]::ET_A') Body TC2 * TyB : typeOf FT ET_B' Cond boolTy TyB1 : stmtOK FT ([]::ET_B') Body TC1 ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.8: Variables: FT ET_B ET_A' ET_B' TC2 S1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (scopeStmt S1) ET_A' @ TyB : stmtOK FT ET_B (scopeStmt S1) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : stmtOK FT ([]::ET_A') S1 TC2 * ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.8: Variables: FT ET_A' ET_B' TC2 S1 TC1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (scopeStmt S1) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : stmtOK FT ([]::ET_A') S1 TC2 * TyB : stmtOK FT ([]::ET_B') S1 TC1 ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.9: Variables: FT ET_B ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (printVal E) ET_A' @ TyB : stmtOK FT ET_B (printVal E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' E intTy * ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.9.1: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E intTy * TyB : typeOf FT ET_B' E intTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.9.2: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E intTy * TyB : typeOf FT ET_B' E boolTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.9.3: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E intTy * TyB : typeOf FT ET_B' E stringTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.10: Variables: FT ET_B ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (printVal E) ET_A' @ TyB : stmtOK FT ET_B (printVal E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' E boolTy * ============================ lookup_all_scopes ET_A' ET_B'
< case TyB. Subgoal 2.10.1: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E boolTy * H1 : typeOf FT ET_B' E intTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.10.2: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E boolTy * H1 : typeOf FT ET_B' E boolTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.10.3: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E boolTy * H1 : typeOf FT ET_B' E stringTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.11: Variables: FT ET_B ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (printVal E) ET_A' @ TyB : stmtOK FT ET_B (printVal E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' E stringTy * ============================ lookup_all_scopes ET_A' ET_B'
< case TyB. Subgoal 2.11.1: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E stringTy * H1 : typeOf FT ET_B' E intTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.11.2: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E stringTy * H1 : typeOf FT ET_B' E boolTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.11.3: Variables: FT ET_A' ET_B' E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (printVal E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E stringTy * H1 : typeOf FT ET_B' E stringTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 3: Variables: FT ET_A ET_B A TysA TysB IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsA : is_args A IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOfArgs FT ET_A A TysA @ TyB : typeOfArgs FT ET_B A TysB Lkp : lookup_all_scopes ET_A ET_B ============================ TysA = TysB
< TyA: case TyA. Subgoal 3.1: Variables: FT ET_A ET_B TysB IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsA : is_args nilArgs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyB : typeOfArgs FT ET_B nilArgs TysB Lkp : lookup_all_scopes ET_A ET_B ============================ [] = TysB
< case TyB. Subgoal 3.1: Variables: FT ET_A ET_B IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsA : is_args nilArgs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B ============================ [] = []
< search. Subgoal 3.2: Variables: FT ET_A ET_B TysB ETys ETy Rest E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsA : is_args (consArgs E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyB : typeOfArgs FT ET_B (consArgs E Rest) TysB Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy * TyA1 : typeOfArgs FT ET_A Rest ETys * ============================ ETy::ETys = TysB
< case IsA. Subgoal 3.2: Variables: FT ET_A ET_B TysB ETys ETy Rest E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyB : typeOfArgs FT ET_B (consArgs E Rest) TysB Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy * TyA1 : typeOfArgs FT ET_A Rest ETys * H1 : is_expr E H2 : is_args Rest ============================ ETy::ETys = TysB
< TyB: case TyB. Subgoal 3.2: Variables: FT ET_A ET_B ETys ETy Rest E ETys1 ETy1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy * TyA1 : typeOfArgs FT ET_A Rest ETys * H1 : is_expr E H2 : is_args Rest TyB : typeOf FT ET_B E ETy1 TyB1 : typeOfArgs FT ET_B Rest ETys1 ============================ ETy::ETys = ETy1::ETys1
< apply IH_E to _ _ _ _ TyA TyB _. Subgoal 3.2: Variables: FT ET_A ET_B ETys Rest E ETys1 ETy1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy1 * TyA1 : typeOfArgs FT ET_A Rest ETys * H1 : is_expr E H2 : is_args Rest TyB : typeOf FT ET_B E ETy1 TyB1 : typeOfArgs FT ET_B Rest ETys1 ============================ ETy1::ETys = ETy1::ETys1
< apply IH_A to _ _ _ _ TyA1 TyB1 _. Subgoal 3.2: Variables: FT ET_A ET_B Rest E ETys1 ETy1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA1 : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy1 * TyA1 : typeOfArgs FT ET_A Rest ETys1 * H1 : is_expr E H2 : is_args Rest TyB : typeOf FT ET_B E ETy1 TyB1 : typeOfArgs FT ET_B Rest ETys1 ============================ ETy1::ETys1 = ETy1::ETys1
< search. Subgoal 4: Variables: FT ET_A ET_B RF FieldsA FieldsB IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsRF : is_recFieldExprs RF IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOfRecFields FT ET_A RF FieldsA @ TyB : typeOfRecFields FT ET_B RF FieldsB Lkp : lookup_all_scopes ET_A ET_B ============================ FieldsA = FieldsB
< TyA: case TyA. Subgoal 4.1: Variables: FT ET_A ET_B FieldsB IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsRF : is_recFieldExprs nilRecFieldExprs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyB : typeOfRecFields FT ET_B nilRecFieldExprs FieldsB Lkp : lookup_all_scopes ET_A ET_B ============================ nilRecFieldTys = FieldsB
< case TyB. Subgoal 4.1: Variables: FT ET_A ET_B IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsRF : is_recFieldExprs nilRecFieldExprs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B ============================ nilRecFieldTys = nilRecFieldTys
< search. Subgoal 4.2: Variables: FT ET_A ET_B FieldsB RestTys ETy Name Rest E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsRF : is_recFieldExprs (consRecFieldExprs Name E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyB : typeOfRecFields FT ET_B (consRecFieldExprs Name E Rest) FieldsB Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy * TyA1 : typeOfRecFields FT ET_A Rest RestTys * ============================ consRecFieldTys Name ETy RestTys = FieldsB
< case IsRF. Subgoal 4.2: Variables: FT ET_A ET_B FieldsB RestTys ETy Name Rest E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyB : typeOfRecFields FT ET_B (consRecFieldExprs Name E Rest) FieldsB Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy * TyA1 : typeOfRecFields FT ET_A Rest RestTys * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest ============================ consRecFieldTys Name ETy RestTys = FieldsB
< TyB: case TyB. Subgoal 4.2: Variables: FT ET_A ET_B RestTys ETy Name Rest E RestTys1 ETy1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy * TyA1 : typeOfRecFields FT ET_A Rest RestTys * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest TyB : typeOf FT ET_B E ETy1 TyB1 : typeOfRecFields FT ET_B Rest RestTys1 ============================ consRecFieldTys Name ETy RestTys = consRecFieldTys Name ETy1 RestTys1
< apply IH_E to _ _ _ _ TyA TyB _. Subgoal 4.2: Variables: FT ET_A ET_B RestTys Name Rest E RestTys1 ETy1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy1 * TyA1 : typeOfRecFields FT ET_A Rest RestTys * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest TyB : typeOf FT ET_B E ETy1 TyB1 : typeOfRecFields FT ET_B Rest RestTys1 ============================ consRecFieldTys Name ETy1 RestTys = consRecFieldTys Name ETy1 RestTys1
< apply IH_RF to _ _ _ _ TyA1 TyB1 _. Subgoal 4.2: Variables: FT ET_A ET_B Name Rest E RestTys1 ETy1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B Lkp : lookup_all_scopes ET_A ET_B TyA : typeOf FT ET_A E ETy1 * TyA1 : typeOfRecFields FT ET_A Rest RestTys1 * H1 : is_string Name H2 : is_expr E H3 : is_recFieldExprs Rest TyB : typeOf FT ET_B E ETy1 TyB1 : typeOfRecFields FT ET_B Rest RestTys1 ============================ consRecFieldTys Name ETy1 RestTys1 = consRecFieldTys Name ETy1 RestTys1
< search. Proof completed.
< Extensible_Theorem paramTy_is : forall P N T, IsP : is_param P -> PT : paramTy P N T -> is_string N /\ is_typ T on PT. Variables: N T IH : forall P N T, is_param P -> paramTy P N T * -> is_string N /\ is_typ T IsP : is_param (param N T) PT : paramTy (param N T) N T @ ============================ is_string N /\ is_typ T
< case IsP. Variables: N T IH : forall P N T, is_param P -> paramTy P N T * -> is_string N /\ is_typ T PT : paramTy (param N T) N T @ H1 : is_string N H2 : is_typ T ============================ is_string N /\ is_typ T
< search. Proof completed.
< Theorem paramTys_is : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys -> is_list (is_pair is_string is_typ) PTys. ============================ forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys -> is_list (is_pair is_string is_typ) PTys
< induction on 2. IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys ============================ forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys @ -> is_list (is_pair is_string is_typ) PTys
< intros IsPs PT. Variables: Ps PTys IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys IsPs : is_list is_param Ps PT : paramTys Ps PTys @ ============================ is_list (is_pair is_string is_typ) PTys
< PT: case PT. Subgoal 1: IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys IsPs : is_list is_param [] ============================ is_list (is_pair is_string is_typ) []
< search. Subgoal 2: Variables: RestTys PTy PName Rest P IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys IsPs : is_list is_param (P::Rest) PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * ============================ is_list (is_pair is_string is_typ) ((PName, PTy)::RestTys)
< case IsPs. Subgoal 2: Variables: RestTys PTy PName Rest P IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * H1 : is_param P H2 : is_list is_param Rest ============================ is_list (is_pair is_string is_typ) ((PName, PTy)::RestTys)
< apply paramTy_is to _ PT. Subgoal 2: Variables: RestTys PTy PName Rest P IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * H1 : is_param P H2 : is_list is_param Rest H3 : is_string PName H4 : is_typ PTy ============================ is_list (is_pair is_string is_typ) ((PName, PTy)::RestTys)
< apply IH to _ PT1. Subgoal 2: Variables: RestTys PTy PName Rest P IH : forall Ps PTys, is_list is_param Ps -> paramTys Ps PTys * -> is_list (is_pair is_string is_typ) PTys PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * H1 : is_param P H2 : is_list is_param Rest H3 : is_string PName H4 : is_typ PTy H5 : is_list (is_pair is_string is_typ) RestTys ============================ is_list (is_pair is_string is_typ) ((PName, PTy)::RestTys)
< search. Proof completed.
< Theorem values_is_ty : forall L V, is_list (is_pair is_string is_typ) L -> values L V -> is_list is_typ V. ============================ forall L V, is_list (is_pair is_string is_typ) L -> values L V -> is_list is_typ V
< induction on 2. IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V ============================ forall L V, is_list (is_pair is_string is_typ) L -> values L V @ -> is_list is_typ V
< intros Is V. Variables: L V IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V Is : is_list (is_pair is_string is_typ) L V : values L V @ ============================ is_list is_typ V
< V: case V. Subgoal 1: IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V Is : is_list (is_pair is_string is_typ) [] ============================ is_list is_typ []
< search. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V Is : is_list (is_pair is_string is_typ) ((A, B)::Rest) V : values Rest VRest * ============================ is_list is_typ (B::VRest)
< Is: case Is. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V V : values Rest VRest * Is : is_pair is_string is_typ (A, B) Is1 : is_list (is_pair is_string is_typ) Rest ============================ is_list is_typ (B::VRest)
< case Is. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V V : values Rest VRest * Is1 : is_list (is_pair is_string is_typ) Rest H1 : is_string A H2 : is_typ B ============================ is_list is_typ (B::VRest)
< apply IH to _ V. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_typ) L -> values L V * -> is_list is_typ V V : values Rest VRest * Is1 : is_list (is_pair is_string is_typ) Rest H1 : is_string A H2 : is_typ B H3 : is_list is_typ VRest ============================ is_list is_typ (B::VRest)
< search. Proof completed.
< Extensible_Theorem getFunInfo_is : forall F N R P, IsF : is_fun F -> GFI : getFunInfo F N R P -> (is_string N /\ is_typ R) /\ is_list is_typ P on GFI. Variables: N R P NameTys Body Params RVVal RetVar IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P IsF : is_fun (fun N R RetVar RVVal Params Body) GFI : getFunInfo (fun N R RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< case IsF. Variables: N R P NameTys Body Params RVVal RetVar IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P GFI : getFunInfo (fun N R RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P H1 : is_string N H2 : is_typ R H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< apply paramTys_is to _ GFI1. Variables: N R P NameTys Body Params RVVal RetVar IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P GFI : getFunInfo (fun N R RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P H1 : is_string N H2 : is_typ R H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body H7 : is_list (is_pair is_string is_typ) NameTys ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< apply values_is_ty to _ GFI2. Variables: N R P NameTys Body Params RVVal RetVar IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P GFI : getFunInfo (fun N R RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P H1 : is_string N H2 : is_typ R H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body H7 : is_list (is_pair is_string is_typ) NameTys H8 : is_list is_typ P ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< search. Proof completed.
< Theorem gatherFunInfo_is : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx. ============================ forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx
< induction on 2. IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx ============================ forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx @ -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx
< intros IsFs GFI. Variables: Fs Ctx IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx IsFs : is_list is_fun Fs GFI : gatherFunInfo Fs Ctx @ ============================ is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx
< GFI: case GFI. Subgoal 1: IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx IsFs : is_list is_fun [] ============================ is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) []
< search. Subgoal 2: Variables: RestTys PTys RetTy Name Rest F IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx IsFs : is_list is_fun (F::Rest) GFI : getFunInfo F Name RetTy PTys GFI1 : gatherFunInfo Rest RestTys * ============================ is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) ((Name, (RetTy, PTys))::RestTys)
< case IsFs. Subgoal 2: Variables: RestTys PTys RetTy Name Rest F IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx GFI : getFunInfo F Name RetTy PTys GFI1 : gatherFunInfo Rest RestTys * H1 : is_fun F H2 : is_list is_fun Rest ============================ is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) ((Name, (RetTy, PTys))::RestTys)
< apply getFunInfo_is to _ GFI. Subgoal 2: Variables: RestTys PTys RetTy Name Rest F IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx GFI : getFunInfo F Name RetTy PTys GFI1 : gatherFunInfo Rest RestTys * H1 : is_fun F H2 : is_list is_fun Rest H3 : is_string Name H4 : is_typ RetTy H5 : is_list is_typ PTys ============================ is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) ((Name, (RetTy, PTys))::RestTys)
< apply IH to _ GFI1. Subgoal 2: Variables: RestTys PTys RetTy Name Rest F IH : forall Fs Ctx, is_list is_fun Fs -> gatherFunInfo Fs Ctx * -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) Ctx GFI : getFunInfo F Name RetTy PTys GFI1 : gatherFunInfo Rest RestTys * H1 : is_fun F H2 : is_list is_fun Rest H3 : is_string Name H4 : is_typ RetTy H5 : is_list is_typ PTys H6 : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) RestTys ============================ is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) ((Name, (RetTy, PTys))::RestTys)
< search. Proof completed.
< Extensible_Theorem paramTy_exists : forall P, IsP : is_param P -> exists N T, paramTy P N T on IsP. Variables: Typ S IH : forall P, is_param P * -> exists N T, paramTy P N T IsP : is_param (param S Typ) @ IsP1 : is_string S IsP2 : is_typ Typ ============================ exists N T, paramTy (param S Typ) N T
< search. Proof completed.
< Theorem paramTys_exists : forall Ps, is_list is_param Ps -> exists PTys, paramTys Ps PTys. ============================ forall Ps, is_list is_param Ps -> exists PTys, paramTys Ps PTys
< induction on 1. IH : forall Ps, is_list is_param Ps * -> exists PTys, paramTys Ps PTys ============================ forall Ps, is_list is_param Ps @ -> exists PTys, paramTys Ps PTys
< intros Is. Variables: Ps IH : forall Ps, is_list is_param Ps * -> exists PTys, paramTys Ps PTys Is : is_list is_param Ps @ ============================ exists PTys, paramTys Ps PTys
< Is: case Is. Subgoal 1: IH : forall Ps, is_list is_param Ps * -> exists PTys, paramTys Ps PTys ============================ exists PTys, paramTys [] PTys
< search. Subgoal 2: Variables: T H IH : forall Ps, is_list is_param Ps * -> exists PTys, paramTys Ps PTys Is : is_param H Is1 : is_list is_param T * ============================ exists PTys, paramTys (H::T) PTys
< apply paramTy_exists to Is. Subgoal 2: Variables: T H N T1 IH : forall Ps, is_list is_param Ps * -> exists PTys, paramTys Ps PTys Is : is_param H Is1 : is_list is_param T * H1 : paramTy H N T1 ============================ exists PTys, paramTys (H::T) PTys
< apply IH to Is1. Subgoal 2: Variables: T H N T1 PTys IH : forall Ps, is_list is_param Ps * -> exists PTys, paramTys Ps PTys Is : is_param H Is1 : is_list is_param T * H1 : paramTy H N T1 H2 : paramTys T PTys ============================ exists PTys, paramTys (H::T) PTys
< search. Proof completed.
< Theorem values_exists_ty : forall L, is_list (is_pair is_string is_typ) L -> exists V, values L V. ============================ forall L, is_list (is_pair is_string is_typ) L -> exists V, values L V
< induction on 1. IH : forall L, is_list (is_pair is_string is_typ) L * -> exists V, values L V ============================ forall L, is_list (is_pair is_string is_typ) L @ -> exists V, values L V
< intros Is. Variables: L IH : forall L, is_list (is_pair is_string is_typ) L * -> exists V, values L V Is : is_list (is_pair is_string is_typ) L @ ============================ exists V, values L V
< Is: case Is. Subgoal 1: IH : forall L, is_list (is_pair is_string is_typ) L * -> exists V, values L V ============================ exists V, values [] V
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_pair is_string is_typ) L * -> exists V, values L V Is : is_pair is_string is_typ H Is1 : is_list (is_pair is_string is_typ) T * ============================ exists V, values (H::T) V
< case Is. Subgoal 2: Variables: T B A IH : forall L, is_list (is_pair is_string is_typ) L * -> exists V, values L V Is1 : is_list (is_pair is_string is_typ) T * H1 : is_string A H2 : is_typ B ============================ exists V, values ((A, B)::T) V
< apply IH to Is1. Subgoal 2: Variables: T B A V IH : forall L, is_list (is_pair is_string is_typ) L * -> exists V, values L V Is1 : is_list (is_pair is_string is_typ) T * H1 : is_string A H2 : is_typ B H3 : values T V ============================ exists V, values ((A, B)::T) V
< search. Proof completed.
< Extensible_Theorem getFunInfo_exists : forall F, IsF : is_fun F -> exists N R P, getFunInfo F N R P on IsF. Variables: Stmt L Value S Typ S1 IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (fun S1 Typ S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_string S IsF4 : is_value Value IsF5 : is_list is_param L IsF6 : is_stmt Stmt ============================ exists N R P, getFunInfo (fun S1 Typ S Value L Stmt) N R P
< PT: apply paramTys_exists to IsF5. Variables: Stmt L Value S Typ S1 PTys IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (fun S1 Typ S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_string S IsF4 : is_value Value IsF5 : is_list is_param L IsF6 : is_stmt Stmt PT : paramTys L PTys ============================ exists N R P, getFunInfo (fun S1 Typ S Value L Stmt) N R P
< Is: apply paramTys_is to _ PT. Variables: Stmt L Value S Typ S1 PTys IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (fun S1 Typ S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_string S IsF4 : is_value Value IsF5 : is_list is_param L IsF6 : is_stmt Stmt PT : paramTys L PTys Is : is_list (is_pair is_string is_typ) PTys ============================ exists N R P, getFunInfo (fun S1 Typ S Value L Stmt) N R P
< apply values_exists_ty to Is. Variables: Stmt L Value S Typ S1 PTys V IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (fun S1 Typ S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_string S IsF4 : is_value Value IsF5 : is_list is_param L IsF6 : is_stmt Stmt PT : paramTys L PTys Is : is_list (is_pair is_string is_typ) PTys H1 : values PTys V ============================ exists N R P, getFunInfo (fun S1 Typ S Value L Stmt) N R P
< search. Proof completed.
< Theorem gatherFunInfo_exists : forall Fs, is_list is_fun Fs -> exists Ctx, gatherFunInfo Fs Ctx. ============================ forall Fs, is_list is_fun Fs -> exists Ctx, gatherFunInfo Fs Ctx
< induction on 1. IH : forall Fs, is_list is_fun Fs * -> exists Ctx, gatherFunInfo Fs Ctx ============================ forall Fs, is_list is_fun Fs @ -> exists Ctx, gatherFunInfo Fs Ctx
< intros Is. Variables: Fs IH : forall Fs, is_list is_fun Fs * -> exists Ctx, gatherFunInfo Fs Ctx Is : is_list is_fun Fs @ ============================ exists Ctx, gatherFunInfo Fs Ctx
< Is: case Is. Subgoal 1: IH : forall Fs, is_list is_fun Fs * -> exists Ctx, gatherFunInfo Fs Ctx ============================ exists Ctx, gatherFunInfo [] Ctx
< search. Subgoal 2: Variables: T H IH : forall Fs, is_list is_fun Fs * -> exists Ctx, gatherFunInfo Fs Ctx Is : is_fun H Is1 : is_list is_fun T * ============================ exists Ctx, gatherFunInfo (H::T) Ctx
< apply getFunInfo_exists to Is. Subgoal 2: Variables: T H N R P IH : forall Fs, is_list is_fun Fs * -> exists Ctx, gatherFunInfo Fs Ctx Is : is_fun H Is1 : is_list is_fun T * H1 : getFunInfo H N R P ============================ exists Ctx, gatherFunInfo (H::T) Ctx
< apply IH to Is1. Subgoal 2: Variables: T H N R P Ctx IH : forall Fs, is_list is_fun Fs * -> exists Ctx, gatherFunInfo Fs Ctx Is : is_fun H Is1 : is_list is_fun T * H1 : getFunInfo H N R P H2 : gatherFunInfo T Ctx ============================ exists Ctx, gatherFunInfo (H::T) Ctx
< search. Proof completed.
< Theorem is_list_mem_lookup : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'. ============================ forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'
< induction on 2. IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' ============================ forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L @ -> is_string ID -> exists E', lookup L ID E'
< intros IsL Mem IsID. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string is_value) L Mem : mem (ID, E) L @ IsID : is_string ID ============================ exists E', lookup L ID E'
< Mem: case Mem. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string is_value) ((ID, E)::Rest) IsID : is_string ID ============================ exists E', lookup ((ID, E)::Rest) ID E'
< search. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string is_value) (I::Rest) IsID : is_string ID Mem : mem (ID, E) Rest * ============================ exists E', lookup (I::Rest) ID E'
< Is: case IsL. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is : is_pair is_string is_value I Is1 : is_list (is_pair is_string is_value) Rest ============================ exists E', lookup (I::Rest) ID E'
< Is: case Is. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_value) Rest Is : is_string A Is2 : is_value B ============================ exists E', lookup ((A, B)::Rest) ID E'
< Or: apply is_string_eq_or_not to Is IsID. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_value) Rest Is : is_string A Is2 : is_value B Or : A = ID \/ (A = ID -> false) ============================ exists E', lookup ((A, B)::Rest) ID E'
< Eq: case Or. Subgoal 2.1: Variables: ID E Rest B IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_value) Rest Is : is_string ID Is2 : is_value B ============================ exists E', lookup ((ID, B)::Rest) ID E'
< search. Subgoal 2.2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_value) Rest Is : is_string A Is2 : is_value B Eq : A = ID -> false ============================ exists E', lookup ((A, B)::Rest) ID E'
< apply IH to Is1 Mem IsID. Subgoal 2.2: Variables: ID E Rest B A E' IH : forall L ID E, is_list (is_pair is_string is_value) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string is_value) Rest Is : is_string A Is2 : is_value B Eq : A = ID -> false H1 : lookup Rest ID E' ============================ exists E', lookup ((A, B)::Rest) ID E'
< search. Proof completed.
< Theorem lookup_is_value : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E -> is_value E. ============================ forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E -> is_value E
< induction on 2. IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E ============================ forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E @ -> is_value E
< intros IsL Lkp. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E IsL : is_list (is_pair is_string is_value) L Lkp : lookup L ID E @ ============================ is_value E
< Lkp: case Lkp. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E IsL : is_list (is_pair is_string is_value) ((ID, E)::Rest) ============================ is_value E
< Is: case IsL. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E Is : is_pair is_string is_value (ID, E) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_value E
< case Is. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E Is1 : is_list (is_pair is_string is_value) Rest H1 : is_string ID H2 : is_value E ============================ is_value E
< search. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E IsL : is_list (is_pair is_string is_value) ((K, V)::Rest) Lkp : K = ID -> false Lkp1 : lookup Rest ID E * ============================ is_value E
< Is: case IsL. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_value (K, V) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_value E
< apply IH to Is1 Lkp1. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_value E Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_value (K, V) Is1 : is_list (is_pair is_string is_value) Rest H1 : is_value E ============================ is_value E
< search. Proof completed.
< Theorem lookup_is_key : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E -> is_string ID. ============================ forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E -> is_string ID
< induction on 2. IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID ============================ forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E @ -> is_string ID
< intros IsL Lkp. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID IsL : is_list (is_pair is_string is_value) L Lkp : lookup L ID E @ ============================ is_string ID
< Lkp: case Lkp. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID IsL : is_list (is_pair is_string is_value) ((ID, E)::Rest) ============================ is_string ID
< Is: case IsL. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID Is : is_pair is_string is_value (ID, E) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_string ID
< case Is. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID Is1 : is_list (is_pair is_string is_value) Rest H1 : is_string ID H2 : is_value E ============================ is_string ID
< search. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID IsL : is_list (is_pair is_string is_value) ((K, V)::Rest) Lkp : K = ID -> false Lkp1 : lookup Rest ID E * ============================ is_string ID
< Is: case IsL. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_value (K, V) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_string ID
< apply IH to Is1 Lkp1. Subgoal 2: Variables: ID E Rest V K IH : forall L ID E, is_list (is_pair is_string is_value) L -> lookup L ID E * -> is_string ID Lkp : K = ID -> false Lkp1 : lookup Rest ID E * Is : is_pair is_string is_value (K, V) Is1 : is_list (is_pair is_string is_value) Rest H1 : is_string ID ============================ is_string ID
< search. Proof completed.
< Theorem lookup_string_value_list_or_no : forall L X, is_list (is_pair is_string is_value) L -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X. ============================ forall L X, is_list (is_pair is_string is_value) L -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X
< induction on 1. IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X ============================ forall L X, is_list (is_pair is_string is_value) L @ -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X
< intros IsL IsX. Variables: L X IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsL : is_list (is_pair is_string is_value) L @ IsX : is_string X ============================ (exists V, lookup L X V) \/ no_lookup L X
< IsL: case IsL. Subgoal 1: Variables: X IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X ============================ (exists V, lookup [] X V) \/ no_lookup [] X
< search. Subgoal 2: Variables: X T H IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL : is_pair is_string is_value H IsL1 : is_list (is_pair is_string is_value) T * ============================ (exists V, lookup (H::T) X V) \/ no_lookup (H::T) X
< Is: case IsL. Subgoal 2: Variables: X T B A IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string A Is1 : is_value B ============================ (exists V, lookup ((A, B)::T) X V) \/ no_lookup ((A, B)::T) X
< Or: apply is_string_eq_or_not to Is IsX. Subgoal 2: Variables: X T B A IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string A Is1 : is_value B Or : A = X \/ (A = X -> false) ============================ (exists V, lookup ((A, B)::T) X V) \/ no_lookup ((A, B)::T) X
< E: case Or. Subgoal 2.1: Variables: X T B IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string X Is1 : is_value B ============================ (exists V, lookup ((X, B)::T) X V) \/ no_lookup ((X, B)::T) X
< search. Subgoal 2.2: Variables: X T B A IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string A Is1 : is_value B E : A = X -> false ============================ (exists V, lookup ((A, B)::T) X V) \/ no_lookup ((A, B)::T) X
< Or: apply IH to IsL1 IsX. Subgoal 2.2: Variables: X T B A IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string A Is1 : is_value B E : A = X -> false Or : (exists V, lookup T X V) \/ no_lookup T X ============================ (exists V, lookup ((A, B)::T) X V) \/ no_lookup ((A, B)::T) X
< L: case Or. Subgoal 2.2.1: Variables: X T B A V IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string A Is1 : is_value B E : A = X -> false L : lookup T X V ============================ (exists V, lookup ((A, B)::T) X V) \/ no_lookup ((A, B)::T) X
< search. Subgoal 2.2.2: Variables: X T B A IH : forall L X, is_list (is_pair is_string is_value) L * -> is_string X -> (exists V, lookup L X V) \/ no_lookup L X IsX : is_string X IsL1 : is_list (is_pair is_string is_value) T * Is : is_string A Is1 : is_value B E : A = X -> false L : no_lookup T X ============================ (exists V, lookup ((A, B)::T) X V) \/ no_lookup ((A, B)::T) X
< search. Proof completed.
< Theorem mem_is : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L -> is_pair is_string is_value IDE. ============================ forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L -> is_pair is_string is_value IDE
< induction on 2. IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE ============================ forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L @ -> is_pair is_string is_value IDE
< intros Is M. Variables: L IDE IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE Is : is_list (is_pair is_string is_value) L M : mem IDE L @ ============================ is_pair is_string is_value IDE
< M: case M. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE Is : is_list (is_pair is_string is_value) (IDE::Rest) ============================ is_pair is_string is_value IDE
< case Is. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE H1 : is_pair is_string is_value IDE H2 : is_list (is_pair is_string is_value) Rest ============================ is_pair is_string is_value IDE
< search. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE Is : is_list (is_pair is_string is_value) (I::Rest) M : mem IDE Rest * ============================ is_pair is_string is_value IDE
< case Is. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE M : mem IDE Rest * H1 : is_pair is_string is_value I H2 : is_list (is_pair is_string is_value) Rest ============================ is_pair is_string is_value IDE
< apply IH to _ M. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string is_value) L -> mem IDE L * -> is_pair is_string is_value IDE M : mem IDE Rest * H1 : is_pair is_string is_value I H2 : is_list (is_pair is_string is_value) Rest H3 : is_pair is_string is_value IDE ============================ is_pair is_string is_value IDE
< search. Proof completed.
< Theorem zip_is : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L -> is_list (is_pair is_string is_value) L. ============================ forall A B L, is_list is_string A -> is_list is_value B -> zip A B L -> is_list (is_pair is_string is_value) L
< induction on 3. IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L ============================ forall A B L, is_list is_string A -> is_list is_value B -> zip A B L @ -> is_list (is_pair is_string is_value) L
< intros IsA IsB Z. Variables: A B L IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L IsA : is_list is_string A IsB : is_list is_value B Z : zip A B L @ ============================ is_list (is_pair is_string is_value) L
< Z: case Z. Subgoal 1: IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L IsA : is_list is_string [] IsB : is_list is_value [] ============================ is_list (is_pair is_string is_value) []
< search. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L IsA : is_list is_string (A1::ARest) IsB : is_list is_value (B1::BRest) Z : zip ARest BRest Rest * ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< IsA: case IsA. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L IsB : is_list is_value (B1::BRest) Z : zip ARest BRest Rest * IsA : is_string A1 IsA1 : is_list is_string ARest ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< IsB: case IsB. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L Z : zip ARest BRest Rest * IsA : is_string A1 IsA1 : is_list is_string ARest IsB : is_value B1 IsB1 : is_list is_value BRest ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< apply IH to _ _ Z. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B L, is_list is_string A -> is_list is_value B -> zip A B L * -> is_list (is_pair is_string is_value) L Z : zip ARest BRest Rest * IsA : is_string A1 IsA1 : is_list is_string ARest IsB : is_value B1 IsB1 : is_list is_value BRest H1 : is_list (is_pair is_string is_value) Rest ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< search. Proof completed.
< Theorem select_is : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L -> is_list (is_pair is_string is_value) L'. ============================ forall L X L', is_list (is_pair is_string is_value) L -> select X L' L -> is_list (is_pair is_string is_value) L'
< induction on 2. IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' ============================ forall L X L', is_list (is_pair is_string is_value) L -> select X L' L @ -> is_list (is_pair is_string is_value) L'
< intros Is S. Variables: L X L' IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' Is : is_list (is_pair is_string is_value) L S : select X L' L @ ============================ is_list (is_pair is_string is_value) L'
< S: case S. Subgoal 1: Variables: X L' IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' Is : is_list (is_pair is_string is_value) (X::L') ============================ is_list (is_pair is_string is_value) L'
< case Is. Subgoal 1: Variables: X L' IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' H1 : is_pair is_string is_value X H2 : is_list (is_pair is_string is_value) L' ============================ is_list (is_pair is_string is_value) L'
< search. Subgoal 2: Variables: X L2 I L1 IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' Is : is_list (is_pair is_string is_value) (I::L2) S : select X L1 L2 * ============================ is_list (is_pair is_string is_value) (I::L1)
< case Is. Subgoal 2: Variables: X L2 I L1 IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' S : select X L1 L2 * H1 : is_pair is_string is_value I H2 : is_list (is_pair is_string is_value) L2 ============================ is_list (is_pair is_string is_value) (I::L1)
< apply IH to _ S. Subgoal 2: Variables: X L2 I L1 IH : forall L X L', is_list (is_pair is_string is_value) L -> select X L' L * -> is_list (is_pair is_string is_value) L' S : select X L1 L2 * H1 : is_pair is_string is_value I H2 : is_list (is_pair is_string is_value) L2 H3 : is_list (is_pair is_string is_value) L1 ============================ is_list (is_pair is_string is_value) (I::L1)
< search. Proof completed.
< Theorem domain_is : forall L D, is_list (is_pair is_string is_value) L -> domain L D -> is_list is_string D. ============================ forall L D, is_list (is_pair is_string is_value) L -> domain L D -> is_list is_string D
< induction on 2. IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D ============================ forall L D, is_list (is_pair is_string is_value) L -> domain L D @ -> is_list is_string D
< intros IsL D. Variables: L D IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D IsL : is_list (is_pair is_string is_value) L D : domain L D @ ============================ is_list is_string D
< D: case D. Subgoal 1: IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D IsL : is_list (is_pair is_string is_value) [] ============================ is_list is_string []
< search. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D IsL : is_list (is_pair is_string is_value) ((A, B)::Rest) D : domain Rest DRest * ============================ is_list is_string (A::DRest)
< Is: case IsL. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D D : domain Rest DRest * Is : is_pair is_string is_value (A, B) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_list is_string (A::DRest)
< case Is. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D D : domain Rest DRest * Is1 : is_list (is_pair is_string is_value) Rest H1 : is_string A H2 : is_value B ============================ is_list is_string (A::DRest)
< apply IH to _ D. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_value) L -> domain L D * -> is_list is_string D D : domain Rest DRest * Is1 : is_list (is_pair is_string is_value) Rest H1 : is_string A H2 : is_value B H3 : is_list is_string DRest ============================ is_list is_string (A::DRest)
< search. Proof completed.
< Theorem names_is : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N -> is_list is_string N. ============================ forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N -> is_list is_string N
< induction on 2. IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N ============================ forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N @ -> is_list is_string N
< intros Is N. Variables: L N IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N Is : is_list (is_list (is_pair is_string is_value)) L N : names L N @ ============================ is_list is_string N
< N: case N. Subgoal 1: IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N Is : is_list (is_list (is_pair is_string is_value)) [] ============================ is_list is_string []
< search. Subgoal 2: Variables: N NScope NRest Rest Scope IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N Is : is_list (is_list (is_pair is_string is_value)) (Scope::Rest) N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = N ============================ is_list is_string N
< case Is. Subgoal 2: Variables: N NScope NRest Rest Scope IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = N H1 : is_list (is_pair is_string is_value) Scope H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ is_list is_string N
< IsNRest: apply IH to _ N1. Subgoal 2: Variables: N NScope NRest Rest Scope IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = N H1 : is_list (is_pair is_string is_value) Scope H2 : is_list (is_list (is_pair is_string is_value)) Rest IsNRest : is_list is_string NRest ============================ is_list is_string N
< IsNScope: apply domain_is to _ N. Subgoal 2: Variables: N NScope NRest Rest Scope IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = N H1 : is_list (is_pair is_string is_value) Scope H2 : is_list (is_list (is_pair is_string is_value)) Rest IsNRest : is_list is_string NRest IsNScope : is_list is_string NScope ============================ is_list is_string N
< apply append_list_string_is to _ _ N2. Subgoal 2: Variables: N NScope NRest Rest Scope IH : forall L N, is_list (is_list (is_pair is_string is_value)) L -> names L N * -> is_list is_string N N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = N H1 : is_list (is_pair is_string is_value) Scope H2 : is_list (is_list (is_pair is_string is_value)) Rest IsNRest : is_list is_string NRest IsNScope : is_list is_string NScope H3 : is_list is_string N ============================ is_list is_string N
< search. Proof completed.
< Theorem domain_exists : forall L, is_list (is_pair is_string is_value) L -> exists D, domain L D. ============================ forall L, is_list (is_pair is_string is_value) L -> exists D, domain L D
< induction on 1. IH : forall L, is_list (is_pair is_string is_value) L * -> exists D, domain L D ============================ forall L, is_list (is_pair is_string is_value) L @ -> exists D, domain L D
< intros Is. Variables: L IH : forall L, is_list (is_pair is_string is_value) L * -> exists D, domain L D Is : is_list (is_pair is_string is_value) L @ ============================ exists D, domain L D
< Is: case Is. Subgoal 1: IH : forall L, is_list (is_pair is_string is_value) L * -> exists D, domain L D ============================ exists D, domain [] D
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_pair is_string is_value) L * -> exists D, domain L D Is : is_pair is_string is_value H Is1 : is_list (is_pair is_string is_value) T * ============================ exists D, domain (H::T) D
< case Is. Subgoal 2: Variables: T B A IH : forall L, is_list (is_pair is_string is_value) L * -> exists D, domain L D Is1 : is_list (is_pair is_string is_value) T * H1 : is_string A H2 : is_value B ============================ exists D, domain ((A, B)::T) D
< apply IH to Is1. Subgoal 2: Variables: T B A D IH : forall L, is_list (is_pair is_string is_value) L * -> exists D, domain L D Is1 : is_list (is_pair is_string is_value) T * H1 : is_string A H2 : is_value B H3 : domain T D ============================ exists D, domain ((A, B)::T) D
< search. Proof completed.
< Theorem names_exists : forall L, is_list (is_list (is_pair is_string is_value)) L -> exists N, names L N. ============================ forall L, is_list (is_list (is_pair is_string is_value)) L -> exists N, names L N
< induction on 1. IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N ============================ forall L, is_list (is_list (is_pair is_string is_value)) L @ -> exists N, names L N
< intros Is. Variables: L IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_list (is_pair is_string is_value)) L @ ============================ exists N, names L N
< Is: case Is. Subgoal 1: IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N ============================ exists N, names [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_pair is_string is_value) H * Is1 : is_list (is_list (is_pair is_string is_value)) T * ============================ exists N, names (H::T) N
< D: apply domain_exists to Is. Subgoal 2: Variables: T H D IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_pair is_string is_value) H * Is1 : is_list (is_list (is_pair is_string is_value)) T * D : domain H D ============================ exists N, names (H::T) N
< N: apply IH to Is1. Subgoal 2: Variables: T H D N IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_pair is_string is_value) H * Is1 : is_list (is_list (is_pair is_string is_value)) T * D : domain H D N : names T N ============================ exists N, names (H::T) N
< IsD: apply domain_is to Is D. Subgoal 2: Variables: T H D N IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_pair is_string is_value) H * Is1 : is_list (is_list (is_pair is_string is_value)) T * D : domain H D N : names T N IsD : is_list is_string D ============================ exists N, names (H::T) N
< IsN: apply names_is to _ N. Subgoal 2: Variables: T H D N IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_pair is_string is_value) H * Is1 : is_list (is_list (is_pair is_string is_value)) T * D : domain H D N : names T N IsD : is_list is_string D IsN : is_list is_string N ============================ exists N, names (H::T) N
< apply append_list_string_total to IsD IsN. Subgoal 2: Variables: T H D N L3 IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, names L N Is : is_list (is_pair is_string is_value) H * Is1 : is_list (is_list (is_pair is_string is_value)) T * D : domain H D N : names T N IsD : is_list is_string D IsN : is_list is_string N H1 : D ++ N = L3 ============================ exists N, names (H::T) N
< search. Proof completed.
< Theorem is_list_mem_lookup_funCtx : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'. ============================ forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L -> is_string ID -> exists E', lookup L ID E'
< induction on 2. IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' ============================ forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L @ -> is_string ID -> exists E', lookup L ID E'
< intros IsL Mem IsID. Variables: L ID E IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L Mem : mem (ID, E) L @ IsID : is_string ID ============================ exists E', lookup L ID E'
< Mem: case Mem. Subgoal 1: Variables: ID E Rest IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) ((ID, E)::Rest) IsID : is_string ID ============================ exists E', lookup ((ID, E)::Rest) ID E'
< search. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsL : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) (I::Rest) IsID : is_string ID Mem : mem (ID, E) Rest * ============================ exists E', lookup (I::Rest) ID E'
< Is: case IsL. Subgoal 2: Variables: ID E Rest I IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) I Is1 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest ============================ exists E', lookup (I::Rest) ID E'
< Is: case Is. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest Is : is_string A Is2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) B ============================ exists E', lookup ((A, B)::Rest) ID E'
< Or: apply is_string_eq_or_not to Is IsID. Subgoal 2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest Is : is_string A Is2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) B Or : A = ID \/ (A = ID -> false) ============================ exists E', lookup ((A, B)::Rest) ID E'
< Eq: case Or. Subgoal 2.1: Variables: ID E Rest B IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest Is : is_string ID Is2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) B ============================ exists E', lookup ((ID, B)::Rest) ID E'
< search. Subgoal 2.2: Variables: ID E Rest B A IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest Is : is_string A Is2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) B Eq : A = ID -> false ============================ exists E', lookup ((A, B)::Rest) ID E'
< apply IH to Is1 Mem IsID. Subgoal 2.2: Variables: ID E Rest B A E' IH : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem (ID, E) L * -> is_string ID -> exists E', lookup L ID E' IsID : is_string ID Mem : mem (ID, E) Rest * Is1 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest Is : is_string A Is2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) B Eq : A = ID -> false H1 : lookup Rest ID E' ============================ exists E', lookup ((A, B)::Rest) ID E'
< search. Proof completed.
< Theorem mem_is_funCtx : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE. ============================ forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< induction on 2. IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE ============================ forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L @ -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< intros Is M. Variables: L IDE IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L M : mem IDE L @ ============================ is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< M: case M. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) (IDE::Rest) ============================ is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< case Is. Subgoal 1: Variables: IDE Rest IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE H1 : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE H2 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest ============================ is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< search. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) (I::Rest) M : mem IDE Rest * ============================ is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< case Is. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE M : mem IDE Rest * H1 : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) I H2 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest ============================ is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< apply IH to _ M. Subgoal 2: Variables: IDE Rest I IH : forall L IDE, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> mem IDE L * -> is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE M : mem IDE Rest * H1 : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) I H2 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Rest H3 : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE ============================ is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) IDE
< search. Proof completed.
< Theorem lookup_is_value_funCtx : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> lookup L ID E -> is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E. ============================ forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> lookup L ID E -> is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E
< intros Is L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E ============================ is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E
< M: apply lookup_mem to L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E M : mem (ID, E) L ============================ is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E
< Is: apply mem_is_funCtx to _ M. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E M : mem (ID, E) L Is1 : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) (ID, E) ============================ is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E
< case Is1. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E M : mem (ID, E) L H1 : is_string ID H2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E ============================ is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E
< search. Proof completed.
< Theorem lookup_is_key_funCtx : forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> lookup L ID E -> is_string ID. ============================ forall L ID E, is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L -> lookup L ID E -> is_string ID
< intros Is L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E ============================ is_string ID
< M: apply lookup_mem to L. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E M : mem (ID, E) L ============================ is_string ID
< Is: apply mem_is_funCtx to _ M. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E M : mem (ID, E) L Is1 : is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt))) (ID, E) ============================ is_string ID
< case Is1. Variables: L ID E Is : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) L L : lookup L ID E M : mem (ID, E) L H1 : is_string ID H2 : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) E ============================ is_string ID
< search. Proof completed.
< Theorem remove_all_mem [Key, Item] : forall (L : list (pair Key Item)) K L' I, remove_all L K L' -> mem (K, I) L' -> false. ============================ forall L K L' I, remove_all L K L' -> mem (K, I) L' -> false
< induction on 1. IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false ============================ forall L K L' I, remove_all L K L' @ -> mem (K, I) L' -> false
< intros RA M. Variables: L K L' I IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false RA : remove_all L K L' @ M : mem (K, I) L' ============================ false
< RA: case RA. Subgoal 1: Variables: K I IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false M : mem (K, I) [] ============================ false
< case M. Subgoal 2: Variables: K L' I Rest Item IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false M : mem (K, I) L' RA : remove_all Rest K L' * ============================ false
< apply IH to RA M. Subgoal 3: Variables: K I R Item K1 Rest IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false M : mem (K, I) ((K1, Item)::R) RA : K1 = K -> false RA1 : remove_all Rest K R * ============================ false
< M: case M. Subgoal 3.1: Variables: R Item K1 Rest IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false RA : K1 = K1 -> false RA1 : remove_all Rest K1 R * ============================ false
< backchain RA. Subgoal 3.2: Variables: K I R Item K1 Rest IH : forall L K L' I, remove_all L K L' * -> mem (K, I) L' -> false RA : K1 = K -> false RA1 : remove_all Rest K R * M : mem (K, I) R ============================ false
< apply IH to RA1 M. Proof completed.
< Theorem remove_all_lookup_other [Key, Item] : forall (L : list (pair Key Item)) K L' X I, remove_all L K L' -> lookup L' X I -> (K = X -> false) -> lookup L X I. ============================ forall L K L' X I, remove_all L K L' -> lookup L' X I -> (K = X -> false) -> lookup L X I
< induction on 1. IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I ============================ forall L K L' X I, remove_all L K L' @ -> lookup L' X I -> (K = X -> false) -> lookup L X I
< intros R L N. Variables: L K L' X I IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I R : remove_all L K L' @ L : lookup L' X I N : K = X -> false ============================ lookup L X I
< R: case R. Subgoal 1: Variables: K X I IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I L : lookup [] X I N : K = X -> false ============================ lookup [] X I
< case L. Subgoal 2: Variables: K L' X I Rest Item IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I L : lookup L' X I N : K = X -> false R : remove_all Rest K L' * ============================ lookup ((K, Item)::Rest) X I
< apply IH to R L _. Subgoal 2: Variables: K L' X I Rest Item IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I L : lookup L' X I N : K = X -> false R : remove_all Rest K L' * H1 : lookup Rest X I ============================ lookup ((K, Item)::Rest) X I
< search. Subgoal 3: Variables: K X I R Item K1 Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I L : lookup ((K1, Item)::R) X I N : K = X -> false R : K1 = K -> false R1 : remove_all Rest K R * ============================ lookup ((K1, Item)::Rest) X I
< L: case L. Subgoal 3.1: Variables: K X I R Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I N : K = X -> false R : X = K -> false R1 : remove_all Rest K R * ============================ lookup ((X, I)::Rest) X I
< search. Subgoal 3.2: Variables: K X I R Item K1 Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I N : K = X -> false R : K1 = K -> false R1 : remove_all Rest K R * L : K1 = X -> false L1 : lookup R X I ============================ lookup ((K1, Item)::Rest) X I
< apply IH to R1 L1 _. Subgoal 3.2: Variables: K X I R Item K1 Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L' X I -> (K = X -> false) -> lookup L X I N : K = X -> false R : K1 = K -> false R1 : remove_all Rest K R * L : K1 = X -> false L1 : lookup R X I H1 : lookup Rest X I ============================ lookup ((K1, Item)::Rest) X I
< search. Proof completed.
< Theorem remove_all_lookup_other_back [Key, Item] : forall (L : list (pair Key Item)) K L' X I, remove_all L K L' -> lookup L X I -> (K = X -> false) -> lookup L' X I. ============================ forall L K L' X I, remove_all L K L' -> lookup L X I -> (K = X -> false) -> lookup L' X I
< induction on 1. IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I ============================ forall L K L' X I, remove_all L K L' @ -> lookup L X I -> (K = X -> false) -> lookup L' X I
< intros R L N. Variables: L K L' X I IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I R : remove_all L K L' @ L : lookup L X I N : K = X -> false ============================ lookup L' X I
< R: case R. Subgoal 1: Variables: K X I IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I L : lookup [] X I N : K = X -> false ============================ lookup [] X I
< case L. Subgoal 2: Variables: K L' X I Rest Item IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I L : lookup ((K, Item)::Rest) X I N : K = X -> false R : remove_all Rest K L' * ============================ lookup L' X I
< L: case L. Subgoal 2.1: Variables: L' X I Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I N : X = X -> false R : remove_all Rest X L' * ============================ lookup L' X I
< apply N to _. Subgoal 2.2: Variables: K L' X I Rest Item IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I N : K = X -> false R : remove_all Rest K L' * L : K = X -> false L1 : lookup Rest X I ============================ lookup L' X I
< apply IH to R L1 _. Subgoal 2.2: Variables: K L' X I Rest Item IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I N : K = X -> false R : remove_all Rest K L' * L : K = X -> false L1 : lookup Rest X I H1 : lookup L' X I ============================ lookup L' X I
< search. Subgoal 3: Variables: K X I R Item K1 Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I L : lookup ((K1, Item)::Rest) X I N : K = X -> false R : K1 = K -> false R1 : remove_all Rest K R * ============================ lookup ((K1, Item)::R) X I
< L: case L. Subgoal 3.1: Variables: K X I R Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I N : K = X -> false R : X = K -> false R1 : remove_all Rest K R * ============================ lookup ((X, I)::R) X I
< search. Subgoal 3.2: Variables: K X I R Item K1 Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I N : K = X -> false R : K1 = K -> false R1 : remove_all Rest K R * L : K1 = X -> false L1 : lookup Rest X I ============================ lookup ((K1, Item)::R) X I
< apply IH to R1 L1 _. Subgoal 3.2: Variables: K X I R Item K1 Rest IH : forall L K L' X I, remove_all L K L' * -> lookup L X I -> (K = X -> false) -> lookup L' X I N : K = X -> false R : K1 = K -> false R1 : remove_all Rest K R * L : K1 = X -> false L1 : lookup Rest X I H1 : lookup R X I ============================ lookup ((K1, Item)::R) X I
< search. Proof completed.
< Theorem remove_all_lookups : forall LA LB K LA' LB' X I, is_list (is_pair is_string is_value) LA -> is_list (is_pair is_string is_value) LB -> is_string K -> is_string X -> (forall X I, lookup LA X I -> lookup LB X I) -> remove_all LA K LA' -> remove_all LB K LB' -> lookup LA' X I -> lookup LB' X I. ============================ forall LA LB K LA' LB' X I, is_list (is_pair is_string is_value) LA -> is_list (is_pair is_string is_value) LB -> is_string K -> is_string X -> (forall X I, lookup LA X I -> lookup LB X I) -> remove_all LA K LA' -> remove_all LB K LB' -> lookup LA' X I -> lookup LB' X I
< intros IsA IsB IsK IsX Lkp RA RB L. Variables: LA LB K LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string K IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA K LA' RB : remove_all LB K LB' L : lookup LA' X I ============================ lookup LB' X I
< Or: apply is_string_eq_or_not to IsK IsX. Variables: LA LB K LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string K IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA K LA' RB : remove_all LB K LB' L : lookup LA' X I Or : K = X \/ (K = X -> false) ============================ lookup LB' X I
< E: case Or. Subgoal 1: Variables: LA LB LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string X IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA X LA' RB : remove_all LB X LB' L : lookup LA' X I ============================ lookup LB' X I
< M: apply lookup_mem to L. Subgoal 1: Variables: LA LB LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string X IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA X LA' RB : remove_all LB X LB' L : lookup LA' X I M : mem (X, I) LA' ============================ lookup LB' X I
< apply remove_all_mem to RA M. Subgoal 2: Variables: LA LB K LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string K IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA K LA' RB : remove_all LB K LB' L : lookup LA' X I E : K = X -> false ============================ lookup LB' X I
< L': apply remove_all_lookup_other to RA L E. Subgoal 2: Variables: LA LB K LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string K IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA K LA' RB : remove_all LB K LB' L : lookup LA' X I E : K = X -> false L' : lookup LA X I ============================ lookup LB' X I
< LB: apply Lkp to L'. Subgoal 2: Variables: LA LB K LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string K IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA K LA' RB : remove_all LB K LB' L : lookup LA' X I E : K = X -> false L' : lookup LA X I LB : lookup LB X I ============================ lookup LB' X I
< apply remove_all_lookup_other_back to RB LB _. Subgoal 2: Variables: LA LB K LA' LB' X I IsA : is_list (is_pair is_string is_value) LA IsB : is_list (is_pair is_string is_value) LB IsK : is_string K IsX : is_string X Lkp : forall X I, lookup LA X I -> lookup LB X I RA : remove_all LA K LA' RB : remove_all LB K LB' L : lookup LA' X I E : K = X -> false L' : lookup LA X I LB : lookup LB X I H1 : lookup LB' X I ============================ lookup LB' X I
< search. Proof completed.
< Theorem remove_all_no_lookup_back [Key, Item] : forall (L : list (pair Key Item)) K L' X, remove_all L K L' -> no_lookup L X -> no_lookup L' X. ============================ forall L K L' X, remove_all L K L' -> no_lookup L X -> no_lookup L' X
< induction on 1. IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X ============================ forall L K L' X, remove_all L K L' @ -> no_lookup L X -> no_lookup L' X
< intros RA N. Variables: L K L' X IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X RA : remove_all L K L' @ N : no_lookup L X ============================ no_lookup L' X
< RA: case RA. Subgoal 1: Variables: K X IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X N : no_lookup [] X ============================ no_lookup [] X
< search. Subgoal 2: Variables: K L' X Rest Item IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X N : no_lookup ((K, Item)::Rest) X RA : remove_all Rest K L' * ============================ no_lookup L' X
< N: case N. Subgoal 2: Variables: K L' X Rest Item IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X RA : remove_all Rest K L' * N : K = X -> false N1 : no_lookup Rest X ============================ no_lookup L' X
< apply IH to RA N1. Subgoal 2: Variables: K L' X Rest Item IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X RA : remove_all Rest K L' * N : K = X -> false N1 : no_lookup Rest X H1 : no_lookup L' X ============================ no_lookup L' X
< search. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X N : no_lookup ((K1, Item)::Rest) X RA : K1 = K -> false RA1 : remove_all Rest K R * ============================ no_lookup ((K1, Item)::R) X
< N: case N. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup Rest X ============================ no_lookup ((K1, Item)::R) X
< apply IH to RA1 N1. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, remove_all L K L' * -> no_lookup L X -> no_lookup L' X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup Rest X H1 : no_lookup R X ============================ no_lookup ((K1, Item)::R) X
< search. Proof completed.
< Theorem remove_all_no_lookup : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' -> no_lookup L' X -> no_lookup L X \/ X = K. ============================ forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' -> no_lookup L' X -> no_lookup L X \/ X = K
< induction on 4. IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K ============================ forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' @ -> no_lookup L' X -> no_lookup L X \/ X = K
< intros IsL IsK IsX RA N. Variables: L K L' X IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsL : is_list (is_pair is_string is_value) L IsK : is_string K IsX : is_string X RA : remove_all L K L' @ N : no_lookup L' X ============================ no_lookup L X \/ X = K
< RA: case RA. Subgoal 1: Variables: K X IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsL : is_list (is_pair is_string is_value) [] IsK : is_string K IsX : is_string X N : no_lookup [] X ============================ no_lookup [] X \/ X = K
< search. Subgoal 2: Variables: K L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsL : is_list (is_pair is_string is_value) ((K, Item)::Rest) IsK : is_string K IsX : is_string X N : no_lookup L' X RA : remove_all Rest K L' * ============================ no_lookup ((K, Item)::Rest) X \/ X = K
< Is: case IsL. Subgoal 2: Variables: K L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X N : no_lookup L' X RA : remove_all Rest K L' * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest ============================ no_lookup ((K, Item)::Rest) X \/ X = K
< Or: apply IH to _ _ _ RA N. Subgoal 2: Variables: K L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X N : no_lookup L' X RA : remove_all Rest K L' * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest Or : no_lookup Rest X \/ X = K ============================ no_lookup ((K, Item)::Rest) X \/ X = K
< E: case Or. Subgoal 2.1: Variables: K L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X N : no_lookup L' X RA : remove_all Rest K L' * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X ============================ no_lookup ((K, Item)::Rest) X \/ X = K
< Or: apply is_string_eq_or_not to IsK IsX. Subgoal 2.1: Variables: K L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X N : no_lookup L' X RA : remove_all Rest K L' * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X Or : K = X \/ (K = X -> false) ============================ no_lookup ((K, Item)::Rest) X \/ X = K
< NE: case Or. Subgoal 2.1.1: Variables: L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string X IsX : is_string X N : no_lookup L' X RA : remove_all Rest X L' * Is : is_pair is_string is_value (X, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X ============================ no_lookup ((X, Item)::Rest) X \/ X = X
< search. Subgoal 2.1.2: Variables: K L' X Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X N : no_lookup L' X RA : remove_all Rest K L' * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X NE : K = X -> false ============================ no_lookup ((K, Item)::Rest) X \/ X = K
< search. Subgoal 2.2: Variables: K L' Rest Item IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string K N : no_lookup L' K RA : remove_all Rest K L' * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest ============================ no_lookup ((K, Item)::Rest) K \/ K = K
< search. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsL : is_list (is_pair is_string is_value) ((K1, Item)::Rest) IsK : is_string K IsX : is_string X N : no_lookup ((K1, Item)::R) X RA : K1 = K -> false RA1 : remove_all Rest K R * ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< N: case N. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsL : is_list (is_pair is_string is_value) ((K1, Item)::Rest) IsK : is_string K IsX : is_string X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup R X ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< Is: case IsL. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup R X Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< Or: apply IH to _ _ _ RA1 N1. Subgoal 3: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup R X Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest Or : no_lookup Rest X \/ X = K ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< E: case Or. Subgoal 3.1: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup R X Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< Or: apply is_string_eq_or_not to IsK IsX. Subgoal 3.1: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup R X Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X Or : K = X \/ (K = X -> false) ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< NE: case Or. Subgoal 3.1.1: Variables: X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string X IsX : is_string X RA : K1 = X -> false RA1 : remove_all Rest X R * N : K1 = X -> false N1 : no_lookup R X Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X ============================ no_lookup ((K1, Item)::Rest) X \/ X = X
< search. Subgoal 3.1.2: Variables: K X R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string X RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = X -> false N1 : no_lookup R X Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest E : no_lookup Rest X NE : K = X -> false ============================ no_lookup ((K1, Item)::Rest) X \/ X = K
< search. Subgoal 3.2: Variables: K R Item K1 Rest IH : forall L K L' X, is_list (is_pair is_string is_value) L -> is_string K -> is_string X -> remove_all L K L' * -> no_lookup L' X -> no_lookup L X \/ X = K IsK : is_string K IsX : is_string K RA : K1 = K -> false RA1 : remove_all Rest K R * N : K1 = K -> false N1 : no_lookup R K Is : is_pair is_string is_value (K1, Item) Is1 : is_list (is_pair is_string is_value) Rest ============================ no_lookup ((K1, Item)::Rest) K \/ K = K
< search. Proof completed.
< Theorem length_exists_list_pair_string_value : forall L, is_list (is_list (is_pair is_string is_value)) L -> exists N, length L N. ============================ forall L, is_list (is_list (is_pair is_string is_value)) L -> exists N, length L N
< induction on 1. IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N ============================ forall L, is_list (is_list (is_pair is_string is_value)) L @ -> exists N, length L N
< intros IsL. Variables: L IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N IsL : is_list (is_list (is_pair is_string is_value)) L @ ============================ exists N, length L N
< IsL: case IsL. Subgoal 1: IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N ============================ exists N, length [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * ============================ exists N, length (H::T) N
< Len: apply IH to IsL1. Subgoal 2: Variables: T H N IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * Len : length T N ============================ exists N, length (H::T) N
< Is: apply length_is to Len. Subgoal 2: Variables: T H N IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * Len : length T N Is : is_integer N ============================ exists N, length (H::T) N
< apply plus_integer_total to _ Is with N1 = 1. Subgoal 2: Variables: T H N N3 IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> exists N, length L N IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * Len : length T N Is : is_integer N H1 : 1 + N = N3 ============================ exists N, length (H::T) N
< search. Proof completed.
< Theorem length_exists_value : forall L, is_list is_value L -> exists N, length L N. ============================ forall L, is_list is_value L -> exists N, length L N
< induction on 1. IH : forall L, is_list is_value L * -> exists N, length L N ============================ forall L, is_list is_value L @ -> exists N, length L N
< intros IsL. Variables: L IH : forall L, is_list is_value L * -> exists N, length L N IsL : is_list is_value L @ ============================ exists N, length L N
< IsL: case IsL. Subgoal 1: IH : forall L, is_list is_value L * -> exists N, length L N ============================ exists N, length [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> exists N, length L N IsL : is_value H IsL1 : is_list is_value T * ============================ exists N, length (H::T) N
< Len: apply IH to IsL1. Subgoal 2: Variables: T H N IH : forall L, is_list is_value L * -> exists N, length L N IsL : is_value H IsL1 : is_list is_value T * Len : length T N ============================ exists N, length (H::T) N
< Is: apply length_is to Len. Subgoal 2: Variables: T H N IH : forall L, is_list is_value L * -> exists N, length L N IsL : is_value H IsL1 : is_list is_value T * Len : length T N Is : is_integer N ============================ exists N, length (H::T) N
< apply plus_integer_total to _ Is with N1 = 1. Subgoal 2: Variables: T H N N3 IH : forall L, is_list is_value L * -> exists N, length L N IsL : is_value H IsL1 : is_list is_value T * Len : length T N Is : is_integer N H1 : 1 + N = N3 ============================ exists N, length (H::T) N
< search. Proof completed.
< Theorem zip_exists [A, B] : forall (A : list A) (B : list B) N, length A N -> length B N -> exists Z, zip A B Z. ============================ forall A B N, length A N -> length B N -> exists Z, zip A B Z
< induction on 1. IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z ============================ forall A B N, length A N @ -> length B N -> exists Z, zip A B Z
< intros LA LB. Variables: A B N IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length A N @ LB : length B N ============================ exists Z, zip A B Z
< LA: case LA. Subgoal 1: Variables: B IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length B 0 ============================ exists Z, zip [] B Z
< LB: case LB. Subgoal 1.1: IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z ============================ exists Z, zip [] [] Z
< search. Subgoal 1.2: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest N' LB1 : 1 + N' = 0 ============================ exists Z, zip [] (A1::Rest) Z
< GEq: apply length_geq_0 to LB. Subgoal 1.2: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest N' LB1 : 1 + N' = 0 GEq : N' >= 0 ============================ exists Z, zip [] (A1::Rest) Z
< Or: apply greatereq_integer_greater_or_eq to GEq. Subgoal 1.2: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest N' LB1 : 1 + N' = 0 GEq : N' >= 0 Or : N' > 0 \/ N' = 0 ============================ exists Z, zip [] (A1::Rest) Z
< L: case Or. Subgoal 1.2.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest N' LB1 : 1 + N' = 0 GEq : N' >= 0 L : N' > 0 ============================ exists Z, zip [] (A1::Rest) Z
< apply length_is to LB. Subgoal 1.2.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest N' LB1 : 1 + N' = 0 GEq : N' >= 0 L : N' > 0 H1 : is_integer N' ============================ exists Z, zip [] (A1::Rest) Z
< apply lt_plus_one to LB1 _. Subgoal 1.2.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest N' LB1 : 1 + N' = 0 GEq : N' >= 0 L : N' > 0 H1 : is_integer N' H2 : N' < 0 ============================ exists Z, zip [] (A1::Rest) Z
< apply greater_less_impossible to L _. Subgoal 1.2.2: Variables: Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length Rest 0 LB1 : 1 + 0 = 0 GEq : 0 >= 0 ============================ exists Z, zip [] (A1::Rest) Z
< case LB1. Subgoal 2: Variables: B N N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LB : length B N LA : length Rest N' * LA1 : 1 + N' = N ============================ exists Z, zip (A1::Rest) B Z
< LB: case LB. Subgoal 2.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = 0 ============================ exists Z, zip (A1::Rest) [] Z
< GEq: apply length_geq_0 to LA. Subgoal 2.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = 0 GEq : N' >= 0 ============================ exists Z, zip (A1::Rest) [] Z
< Or: apply greatereq_integer_greater_or_eq to GEq. Subgoal 2.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = 0 GEq : N' >= 0 Or : N' > 0 \/ N' = 0 ============================ exists Z, zip (A1::Rest) [] Z
< L: case Or. Subgoal 2.1.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = 0 GEq : N' >= 0 L : N' > 0 ============================ exists Z, zip (A1::Rest) [] Z
< apply length_is to LA. Subgoal 2.1.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = 0 GEq : N' >= 0 L : N' > 0 H1 : is_integer N' ============================ exists Z, zip (A1::Rest) [] Z
< apply lt_plus_one to LA1 _. Subgoal 2.1.1: Variables: N' Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = 0 GEq : N' >= 0 L : N' > 0 H1 : is_integer N' H2 : N' < 0 ============================ exists Z, zip (A1::Rest) [] Z
< apply greater_less_impossible to L _. Subgoal 2.1.2: Variables: Rest A1 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest 0 * LA1 : 1 + 0 = 0 GEq : 0 >= 0 ============================ exists Z, zip (A1::Rest) [] Z
< case LA1. Subgoal 2.2: Variables: N N' Rest A1 N'1 Rest1 A2 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = N LB : length Rest1 N'1 LB1 : 1 + N'1 = N ============================ exists Z, zip (A1::Rest) (A2::Rest1) Z
< apply length_is to LA. Subgoal 2.2: Variables: N N' Rest A1 N'1 Rest1 A2 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = N LB : length Rest1 N'1 LB1 : 1 + N'1 = N H1 : is_integer N' ============================ exists Z, zip (A1::Rest) (A2::Rest1) Z
< apply length_is to LB. Subgoal 2.2: Variables: N N' Rest A1 N'1 Rest1 A2 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N' * LA1 : 1 + N' = N LB : length Rest1 N'1 LB1 : 1 + N'1 = N H1 : is_integer N' H2 : is_integer N'1 ============================ exists Z, zip (A1::Rest) (A2::Rest1) Z
< apply plus_integer_unique_addend to _ _ _ LA1 LB1. Subgoal 2.2: Variables: N Rest A1 N'1 Rest1 A2 IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N'1 * LA1 : 1 + N'1 = N LB : length Rest1 N'1 LB1 : 1 + N'1 = N H1 : is_integer N'1 H2 : is_integer N'1 ============================ exists Z, zip (A1::Rest) (A2::Rest1) Z
< apply IH to LA LB. Subgoal 2.2: Variables: N Rest A1 N'1 Rest1 A2 Z IH : forall A B N, length A N * -> length B N -> exists Z, zip A B Z LA : length Rest N'1 * LA1 : 1 + N'1 = N LB : length Rest1 N'1 LB1 : 1 + N'1 = N H1 : is_integer N'1 H2 : is_integer N'1 H3 : zip Rest Rest1 Z ============================ exists Z, zip (A1::Rest) (A2::Rest1) Z
< search. Proof completed.
< Theorem zip_is_string_value : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z -> is_list (is_pair is_string is_value) Z. ============================ forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z -> is_list (is_pair is_string is_value) Z
< induction on 3. IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z ============================ forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z @ -> is_list (is_pair is_string is_value) Z
< intros IsA IsB Z. Variables: A B Z IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z IsA : is_list is_string A IsB : is_list is_value B Z : zip A B Z @ ============================ is_list (is_pair is_string is_value) Z
< Z: case Z. Subgoal 1: IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z IsA : is_list is_string [] IsB : is_list is_value [] ============================ is_list (is_pair is_string is_value) []
< search. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z IsA : is_list is_string (A1::ARest) IsB : is_list is_value (B1::BRest) Z : zip ARest BRest Rest * ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< case IsA. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z IsB : is_list is_value (B1::BRest) Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< case IsB. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest H3 : is_value B1 H4 : is_list is_value BRest ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< apply IH to _ _ Z. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_value B -> zip A B Z * -> is_list (is_pair is_string is_value) Z Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest H3 : is_value B1 H4 : is_list is_value BRest H5 : is_list (is_pair is_string is_value) Rest ============================ is_list (is_pair is_string is_value) ((A1, B1)::Rest)
< search. Proof completed.
< Theorem mem_lookup : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L -> exists V', lookup L X V'. ============================ forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L -> exists V', lookup L X V'
< induction on 2. IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' ============================ forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L @ -> exists V', lookup L X V'
< intros IsL M. Variables: L X V IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' IsL : is_list (is_pair is_string is_value) L M : mem (X, V) L @ ============================ exists V', lookup L X V'
< M: case M. Subgoal 1: Variables: X V Rest IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' IsL : is_list (is_pair is_string is_value) ((X, V)::Rest) ============================ exists V', lookup ((X, V)::Rest) X V'
< search. Subgoal 2: Variables: X V Rest I IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' IsL : is_list (is_pair is_string is_value) (I::Rest) M : mem (X, V) Rest * ============================ exists V', lookup (I::Rest) X V'
< IsL: case IsL. Subgoal 2: Variables: X V Rest I IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL : is_pair is_string is_value I IsL1 : is_list (is_pair is_string is_value) Rest ============================ exists V', lookup (I::Rest) X V'
< Is: apply mem_is to _ M. Subgoal 2: Variables: X V Rest I IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL : is_pair is_string is_value I IsL1 : is_list (is_pair is_string is_value) Rest Is : is_pair is_string is_value (X, V) ============================ exists V', lookup (I::Rest) X V'
< IsA: case IsL. Subgoal 2: Variables: X V Rest B A IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL1 : is_list (is_pair is_string is_value) Rest Is : is_pair is_string is_value (X, V) IsA : is_string A IsA1 : is_value B ============================ exists V', lookup ((A, B)::Rest) X V'
< IsB: case Is. Subgoal 2: Variables: X V Rest B A IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL1 : is_list (is_pair is_string is_value) Rest IsA : is_string A IsA1 : is_value B IsB : is_string X IsB1 : is_value V ============================ exists V', lookup ((A, B)::Rest) X V'
< Or: apply is_string_eq_or_not to IsA IsB. Subgoal 2: Variables: X V Rest B A IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL1 : is_list (is_pair is_string is_value) Rest IsA : is_string A IsA1 : is_value B IsB : is_string X IsB1 : is_value V Or : A = X \/ (A = X -> false) ============================ exists V', lookup ((A, B)::Rest) X V'
< E: case Or. Subgoal 2.1: Variables: X V Rest B IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL1 : is_list (is_pair is_string is_value) Rest IsA : is_string X IsA1 : is_value B IsB : is_string X IsB1 : is_value V ============================ exists V', lookup ((X, B)::Rest) X V'
< search. Subgoal 2.2: Variables: X V Rest B A IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL1 : is_list (is_pair is_string is_value) Rest IsA : is_string A IsA1 : is_value B IsB : is_string X IsB1 : is_value V E : A = X -> false ============================ exists V', lookup ((A, B)::Rest) X V'
< apply IH to _ M. Subgoal 2.2: Variables: X V Rest B A V' IH : forall L X V, is_list (is_pair is_string is_value) L -> mem (X, V) L * -> exists V', lookup L X V' M : mem (X, V) Rest * IsL1 : is_list (is_pair is_string is_value) Rest IsA : is_string A IsA1 : is_value B IsB : is_string X IsB1 : is_value V E : A = X -> false H1 : lookup Rest X V' ============================ exists V', lookup ((A, B)::Rest) X V'
< search. Proof completed.
< Theorem replaceScopes_lookup_all_scopes : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' -> replaceScopes X V B B' -> lookup_all_scopes A' B'. ============================ forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' -> replaceScopes X V B B' -> lookup_all_scopes A' B'
< induction on 4. IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' ============================ forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' @ -> replaceScopes X V B B' -> lookup_all_scopes A' B'
< intros IsA IsB LAS RA RB. Variables: X V A B A' B' IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B LAS : lookup_all_scopes A B RA : replaceScopes X V A A' @ RB : replaceScopes X V B B' ============================ lookup_all_scopes A' B'
< RA: case RA. Subgoal 1: Variables: X V B B' I Rest LRemain L IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B LAS : lookup_all_scopes (L::Rest) B RB : replaceScopes X V B B' RA : mem (X, I) L RA1 : remove_all L X LRemain ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) B'
< RB: case RB. Subgoal 1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (((X, V)::LRemain1)::Rest1)
< LAS: case LAS (keep). Subgoal 1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (((X, V)::LRemain1)::Rest1)
< unfold . Subgoal 1.1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 ============================ forall X1 V1, lookup ((X, V)::LRemain) X1 V1 -> lookup ((X, V)::LRemain1) X1 V1
< intros L. Subgoal 1.1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 L : lookup ((X, V)::LRemain) X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< L: case L. Subgoal 1.1.1.1: Variables: I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X1, I) L RA1 : remove_all L X1 LRemain RB : mem (X1, I1) L1 RB1 : remove_all L1 X1 LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 ============================ lookup ((X1, V1)::LRemain1) X1 V1
< search. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< LL: apply remove_all_lookup_other to RA1 L1 _. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 LL : lookup L X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< LB: apply LAS1 to LL. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 LL : lookup L X1 V1 LB : lookup L1 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< apply remove_all_lookup_other_back to RB1 LB _. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 LL : lookup L X1 V1 LB : lookup L1 X1 V1 H1 : lookup LRemain1 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< search. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 ============================ forall X1, is_string X1 -> no_lookup ((X, V)::LRemain) X1 -> no_lookup ((X, V)::LRemain1) X1
< intros X N. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : no_lookup ((X, V)::LRemain) X1 ============================ no_lookup ((X, V)::LRemain1) X1
< N: case N. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 ============================ no_lookup ((X, V)::LRemain1) X1
< case IsB. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 ============================ no_lookup ((X, V)::LRemain1) X1
< IsP: apply mem_is to _ RB. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 IsP : is_pair is_string is_value (X, I1) ============================ no_lookup ((X, V)::LRemain1) X1
< case IsP. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 ============================ no_lookup ((X, V)::LRemain1) X1
< case IsA. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 H5 : is_list (is_pair is_string is_value) L H6 : is_list (is_list (is_pair is_string is_value)) Rest ============================ no_lookup ((X, V)::LRemain1) X1
< Or: apply remove_all_no_lookup to _ _ _ RA1 N1. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 H5 : is_list (is_pair is_string is_value) L H6 : is_list (is_list (is_pair is_string is_value)) Rest Or : no_lookup L X1 \/ X1 = X ============================ no_lookup ((X, V)::LRemain1) X1
< NL: case Or. Subgoal 1.1.2.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 H5 : is_list (is_pair is_string is_value) L H6 : is_list (is_list (is_pair is_string is_value)) Rest NL : no_lookup L X1 ============================ no_lookup ((X, V)::LRemain1) X1
< NL1: apply LAS2 to _ NL. Subgoal 1.1.2.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 H5 : is_list (is_pair is_string is_value) L H6 : is_list (is_list (is_pair is_string is_value)) Rest NL : no_lookup L X1 NL1 : no_lookup L1 X1 ============================ no_lookup ((X, V)::LRemain1) X1
< apply remove_all_no_lookup_back to RB1 NL1. Subgoal 1.1.2.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X1 N : X = X1 -> false N1 : no_lookup LRemain X1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 H5 : is_list (is_pair is_string is_value) L H6 : is_list (is_list (is_pair is_string is_value)) Rest NL : no_lookup L X1 NL1 : no_lookup L1 X1 H7 : no_lookup LRemain1 X1 ============================ no_lookup ((X, V)::LRemain1) X1
< search. Subgoal 1.1.2.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 X : is_string X N : X = X -> false N1 : no_lookup LRemain X H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I1 H5 : is_list (is_pair is_string is_value) L H6 : is_list (is_list (is_pair is_string is_value)) Rest ============================ no_lookup ((X, V)::LRemain1) X
< apply N to _. Subgoal 1.1.3: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : mem (X, I1) L1 RB1 : remove_all L1 X LRemain1 LAS1 : forall X V, lookup L X V -> lookup L1 X V LAS2 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS3 : lookup_all_scopes Rest Rest1 ============================ lookup_all_scopes Rest Rest1
< search. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (L1::New)
< case IsA. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (L1::New)
< LA: apply mem_lookup to _ RA. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 V' IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest LA : lookup L X V' ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (L1::New)
< LAS: case LAS. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 V' IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest LA : lookup L X V' LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (L1::New)
< LB: apply LAS to LA. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 V' IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) RA : mem (X, I) L RA1 : remove_all L X LRemain RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest LA : lookup L X V' LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 LB : lookup L1 X V' ============================ lookup_all_scopes (((X, V)::LRemain)::Rest) (L1::New)
< apply no_lookup to RB LB. Subgoal 2: Variables: X V B B' New L Rest IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B LAS : lookup_all_scopes (L::Rest) B RB : replaceScopes X V B B' RA : no_lookup L X RA1 : replaceScopes X V Rest New * ============================ lookup_all_scopes (L::New) B'
< RB: case RB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain ============================ lookup_all_scopes (L::New) (((X, V)::LRemain)::Rest1)
< LAS: case LAS. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 ============================ lookup_all_scopes (L::New) (((X, V)::LRemain)::Rest1)
< case IsB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 ============================ lookup_all_scopes (L::New) (((X, V)::LRemain)::Rest1)
< IsP: apply mem_is to _ RB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 IsP : is_pair is_string is_value (X, I) ============================ lookup_all_scopes (L::New) (((X, V)::LRemain)::Rest1)
< case IsP. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I ============================ lookup_all_scopes (L::New) (((X, V)::LRemain)::Rest1)
< LB: apply LAS1 to _ RA. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : mem (X, I) L1 RB1 : remove_all L1 X LRemain LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 H3 : is_string X H4 : is_value I LB : no_lookup L1 X ============================ lookup_all_scopes (L::New) (((X, V)::LRemain)::Rest1)
< apply no_lookup_mem to LB RB. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) LAS : lookup_all_scopes (L::Rest) (L1::Rest1) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New1 ============================ lookup_all_scopes (L::New) (L1::New1)
< LAS: case LAS. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New1 LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 ============================ lookup_all_scopes (L::New) (L1::New1)
< case IsA. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New1 LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ lookup_all_scopes (L::New) (L1::New1)
< case IsB. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New1 LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L1 H4 : is_list (is_list (is_pair is_string is_value)) Rest1 ============================ lookup_all_scopes (L::New) (L1::New1)
< apply IH to _ _ _ RA1 RB1. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall X V A B A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> lookup_all_scopes A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> lookup_all_scopes A' B' RA : no_lookup L X RA1 : replaceScopes X V Rest New * RB : no_lookup L1 X RB1 : replaceScopes X V Rest1 New1 LAS : forall X V, lookup L X V -> lookup L1 X V LAS1 : forall X, is_string X -> no_lookup L X -> no_lookup L1 X LAS2 : lookup_all_scopes Rest Rest1 H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L1 H4 : is_list (is_list (is_pair is_string is_value)) Rest1 H5 : lookup_all_scopes New New1 ============================ lookup_all_scopes (L::New) (L1::New1)
< search. Proof completed.
< Theorem lookupScopes_is : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V -> is_value V /\ is_string X. ============================ forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V -> is_value V /\ is_string X
< induction on 2. IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X ============================ forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V @ -> is_value V /\ is_string X
< intros Is L. Variables: L X V IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X Is : is_list (is_list (is_pair is_string is_value)) L L : lookupScopes X L V @ ============================ is_value V /\ is_string X
< L: case L. Subgoal 1: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X Is : is_list (is_list (is_pair is_string is_value)) (L1::Rest) L : lookup L1 X V ============================ is_value V /\ is_string X
< case Is. Subgoal 1: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X L : lookup L1 X V H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ is_value V /\ is_string X
< apply lookup_is_value to _ L. Subgoal 1: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X L : lookup L1 X V H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_value V ============================ is_value V /\ is_string X
< apply lookup_is_key to _ L. Subgoal 1: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X L : lookup L1 X V H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_value V H4 : is_string X ============================ is_value V /\ is_string X
< search. Subgoal 2: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X Is : is_list (is_list (is_pair is_string is_value)) (L1::Rest) L : no_lookup L1 X L1 : lookupScopes X Rest V * ============================ is_value V /\ is_string X
< case Is. Subgoal 2: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X L : no_lookup L1 X L1 : lookupScopes X Rest V * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ is_value V /\ is_string X
< apply IH to _ L1. Subgoal 2: Variables: X V Rest L1 IH : forall L X V, is_list (is_list (is_pair is_string is_value)) L -> lookupScopes X L V * -> is_value V /\ is_string X L : no_lookup L1 X L1 : lookupScopes X Rest V * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_value V H4 : is_string X ============================ is_value V /\ is_string X
< search. Proof completed.
< Theorem remove_all_is : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' -> is_list (is_pair is_string is_value) L'. ============================ forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' -> is_list (is_pair is_string is_value) L'
< induction on 2. IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' ============================ forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' @ -> is_list (is_pair is_string is_value) L'
< intros IsL R. Variables: L X L' IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' IsL : is_list (is_pair is_string is_value) L R : remove_all L X L' @ ============================ is_list (is_pair is_string is_value) L'
< R: case R. Subgoal 1: Variables: X IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' IsL : is_list (is_pair is_string is_value) [] ============================ is_list (is_pair is_string is_value) []
< search. Subgoal 2: Variables: X L' Rest Item IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' IsL : is_list (is_pair is_string is_value) ((X, Item)::Rest) R : remove_all Rest X L' * ============================ is_list (is_pair is_string is_value) L'
< Is: case IsL. Subgoal 2: Variables: X L' Rest Item IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' R : remove_all Rest X L' * Is : is_pair is_string is_value (X, Item) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_list (is_pair is_string is_value) L'
< apply IH to _ R. Subgoal 2: Variables: X L' Rest Item IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' R : remove_all Rest X L' * Is : is_pair is_string is_value (X, Item) Is1 : is_list (is_pair is_string is_value) Rest H1 : is_list (is_pair is_string is_value) L' ============================ is_list (is_pair is_string is_value) L'
< search. Subgoal 3: Variables: X R Item K Rest IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' IsL : is_list (is_pair is_string is_value) ((K, Item)::Rest) R : K = X -> false R1 : remove_all Rest X R * ============================ is_list (is_pair is_string is_value) ((K, Item)::R)
< Is: case IsL. Subgoal 3: Variables: X R Item K Rest IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' R : K = X -> false R1 : remove_all Rest X R * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_list (is_pair is_string is_value) ((K, Item)::R)
< apply IH to _ R1. Subgoal 3: Variables: X R Item K Rest IH : forall L X L', is_list (is_pair is_string is_value) L -> remove_all L X L' * -> is_list (is_pair is_string is_value) L' R : K = X -> false R1 : remove_all Rest X R * Is : is_pair is_string is_value (K, Item) Is1 : is_list (is_pair is_string is_value) Rest H1 : is_list (is_pair is_string is_value) R ============================ is_list (is_pair is_string is_value) ((K, Item)::R)
< search. Proof completed.
< Theorem replaceScopes_is : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' -> is_list (is_list (is_pair is_string is_value)) L'. ============================ forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' -> is_list (is_list (is_pair is_string is_value)) L'
< induction on 3. IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' ============================ forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' @ -> is_list (is_list (is_pair is_string is_value)) L'
< intros IsL IsV R. Variables: L X V L' IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsL : is_list (is_list (is_pair is_string is_value)) L IsV : is_value V R : replaceScopes X V L L' @ ============================ is_list (is_list (is_pair is_string is_value)) L'
< R: case R. Subgoal 1: Variables: X V I Rest LRemain L1 IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsV : is_value V R : mem (X, I) L1 R1 : remove_all L1 X LRemain ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest)
< case IsL. Subgoal 1: Variables: X V I Rest LRemain L1 IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsV : is_value V R : mem (X, I) L1 R1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest)
< apply remove_all_is to _ R1. Subgoal 1: Variables: X V I Rest LRemain L1 IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsV : is_value V R : mem (X, I) L1 R1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) LRemain ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest)
< IsP: apply mem_is to _ R. Subgoal 1: Variables: X V I Rest LRemain L1 IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsV : is_value V R : mem (X, I) L1 R1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) LRemain IsP : is_pair is_string is_value (X, I) ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest)
< case IsP. Subgoal 1: Variables: X V I Rest LRemain L1 IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsV : is_value V R : mem (X, I) L1 R1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) LRemain H4 : is_string X H5 : is_value I ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest)
< search. Subgoal 2: Variables: X V New L1 Rest IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsV : is_value V R : no_lookup L1 X R1 : replaceScopes X V Rest New * ============================ is_list (is_list (is_pair is_string is_value)) (L1::New)
< case IsL. Subgoal 2: Variables: X V New L1 Rest IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsV : is_value V R : no_lookup L1 X R1 : replaceScopes X V Rest New * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ is_list (is_list (is_pair is_string is_value)) (L1::New)
< apply IH to _ _ R1. Subgoal 2: Variables: X V New L1 Rest IH : forall L X V L', is_list (is_list (is_pair is_string is_value)) L -> is_value V -> replaceScopes X V L L' * -> is_list (is_list (is_pair is_string is_value)) L' IsV : is_value V R : no_lookup L1 X R1 : replaceScopes X V Rest New * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_list (is_pair is_string is_value)) New ============================ is_list (is_list (is_pair is_string is_value)) (L1::New)
< search. Proof completed.
< Theorem replaceRecVal_is : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' -> is_list (is_pair is_string is_value) L'. ============================ forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' -> is_list (is_pair is_string is_value) L'
< induction on 3. IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' ============================ forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' @ -> is_list (is_pair is_string is_value) L'
< intros IsV IsL RRV. Variables: F V L L' IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L RRV : replaceRecVal F V L L' @ ============================ is_list (is_pair is_string is_value) L'
< RRV: case RRV. Subgoal 1: Variables: F V Rest VOld IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) ((F, VOld)::Rest) ============================ is_list (is_pair is_string is_value) ((F, V)::Rest)
< Is: case IsL. Subgoal 1: Variables: F V Rest VOld IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V Is : is_pair is_string is_value (F, VOld) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_list (is_pair is_string is_value) ((F, V)::Rest)
< case Is. Subgoal 1: Variables: F V Rest VOld IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V Is1 : is_list (is_pair is_string is_value) Rest H1 : is_string F H2 : is_value VOld ============================ is_list (is_pair is_string is_value) ((F, V)::Rest)
< search. Subgoal 2: Variables: F V RRest VO O Rest IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) ((O, VO)::Rest) RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * ============================ is_list (is_pair is_string is_value) ((O, VO)::RRest)
< Is: case IsL. Subgoal 2: Variables: F V RRest VO O Rest IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * Is : is_pair is_string is_value (O, VO) Is1 : is_list (is_pair is_string is_value) Rest ============================ is_list (is_pair is_string is_value) ((O, VO)::RRest)
< apply IH to _ _ RRV1. Subgoal 2: Variables: F V RRest VO O Rest IH : forall F V L L', is_value V -> is_list (is_pair is_string is_value) L -> replaceRecVal F V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * Is : is_pair is_string is_value (O, VO) Is1 : is_list (is_pair is_string is_value) Rest H1 : is_list (is_pair is_string is_value) RRest ============================ is_list (is_pair is_string is_value) ((O, VO)::RRest)
< search. Proof completed.
< Theorem updateRecFields_is : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' -> is_list (is_pair is_string is_value) L'. ============================ forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' -> is_list (is_pair is_string is_value) L'
< induction on 4. IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' ============================ forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' @ -> is_list (is_pair is_string is_value) L'
< intros IsV IsFs IsL U. Variables: Fs V L L' IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsFs : is_list is_string Fs IsL : is_list (is_pair is_string is_value) L U : updateRecFields Fs V L L' @ ============================ is_list (is_pair is_string is_value) L'
< U: case U. Subgoal 1: Variables: V L L' F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsFs : is_list is_string [F] IsL : is_list (is_pair is_string is_value) L U : replaceRecVal F V L L' ============================ is_list (is_pair is_string is_value) L'
< apply replaceRecVal_is to _ _ U. Subgoal 1: Variables: V L L' F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsFs : is_list is_string [F] IsL : is_list (is_pair is_string is_value) L U : replaceRecVal F V L L' H1 : is_list (is_pair is_string is_value) L' ============================ is_list (is_pair is_string is_value) L'
< case IsFs. Subgoal 1: Variables: V L L' F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L U : replaceRecVal F V L L' H1 : is_list (is_pair is_string is_value) L' H2 : is_string F H3 : is_list is_string [] ============================ is_list (is_pair is_string is_value) L'
< search. Subgoal 2: Variables: V L L' Fields Updated FRest F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsFs : is_list is_string (F::FRest) IsL : is_list (is_pair is_string is_value) L U : lookup L F (recVal Fields) U1 : updateRecFields FRest V Fields Updated * U2 : replaceRecVal F (recVal Updated) L L' ============================ is_list (is_pair is_string is_value) L'
< IsFs: case IsFs. Subgoal 2: Variables: V L L' Fields Updated FRest F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L U : lookup L F (recVal Fields) U1 : updateRecFields FRest V Fields Updated * U2 : replaceRecVal F (recVal Updated) L L' IsFs : is_string F IsFs1 : is_list is_string FRest ============================ is_list (is_pair is_string is_value) L'
< IsRV: apply lookup_is_value to _ U. Subgoal 2: Variables: V L L' Fields Updated FRest F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L U : lookup L F (recVal Fields) U1 : updateRecFields FRest V Fields Updated * U2 : replaceRecVal F (recVal Updated) L L' IsFs : is_string F IsFs1 : is_list is_string FRest IsRV : is_value (recVal Fields) ============================ is_list (is_pair is_string is_value) L'
< case IsRV. Subgoal 2: Variables: V L L' Fields Updated FRest F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L U : lookup L F (recVal Fields) U1 : updateRecFields FRest V Fields Updated * U2 : replaceRecVal F (recVal Updated) L L' IsFs : is_string F IsFs1 : is_list is_string FRest H1 : is_list (is_pair is_string is_value) Fields ============================ is_list (is_pair is_string is_value) L'
< apply IH to _ _ _ U1. Subgoal 2: Variables: V L L' Fields Updated FRest F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L U : lookup L F (recVal Fields) U1 : updateRecFields FRest V Fields Updated * U2 : replaceRecVal F (recVal Updated) L L' IsFs : is_string F IsFs1 : is_list is_string FRest H1 : is_list (is_pair is_string is_value) Fields H2 : is_list (is_pair is_string is_value) Updated ============================ is_list (is_pair is_string is_value) L'
< apply replaceRecVal_is to _ _ U2. Subgoal 2: Variables: V L L' Fields Updated FRest F IH : forall Fs V L L', is_value V -> is_list is_string Fs -> is_list (is_pair is_string is_value) L -> updateRecFields Fs V L L' * -> is_list (is_pair is_string is_value) L' IsV : is_value V IsL : is_list (is_pair is_string is_value) L U : lookup L F (recVal Fields) U1 : updateRecFields FRest V Fields Updated * U2 : replaceRecVal F (recVal Updated) L L' IsFs : is_string F IsFs1 : is_list is_string FRest H1 : is_list (is_pair is_string is_value) Fields H2 : is_list (is_pair is_string is_value) Updated H3 : is_list (is_pair is_string is_value) L' ============================ is_list (is_pair is_string is_value) L'
< search. Proof completed.
< Extensible_Theorem evalExpr_isCtx : forall FE EE EE' E V O, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalExpr FE EE E V EE' O -> is_list (is_list (is_pair is_string is_value)) EE' on Ev as IH_C_E, evalExpr_isValue : forall FE EE EE' E V O, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalExpr FE EE E V EE' O -> is_value V on Ev as IH_V_E, evalStmt_isCtx : forall FE EE EE' S O, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalStmt FE EE S EE' O -> is_list (is_list (is_pair is_string is_value)) EE' on Ev as IH_C_S, evalArgs_isCtx : forall FE EE EE' A V O, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalArgs FE EE A V EE' O -> is_list (is_list (is_pair is_string is_value)) EE' on Ev as IH_C_A, evalArgs_isValue : forall FE EE EE' A V O, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalArgs FE EE A V EE' O -> is_list is_value V on Ev as IH_V_A, evalRecFields_isCtx : forall FE EE EE' RF V O, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalRecFields FE EE RF V EE' O -> is_list (is_list (is_pair is_string is_value)) EE' on Ev as IH_C_RF, evalRecFields_isValue : forall FE EE EE' RF V O, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalRecFields FE EE RF V EE' O -> is_list (is_pair is_string is_value) V on Ev as IH_V_RF. Subgoal 1.1: Variables: FE EE' I IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.6: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.7: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.14: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.14: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * Is : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.14: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * Is : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.15: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.15: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * Is : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.15: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * Is : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.20: Variables: FE EE' S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.22: Variables: FE EE' V X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsE. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_A to _ _ _ Ev2. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_S to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< IsEE3: apply IH_C_E to _ _ _ Ev2. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE3 : is_list (is_list (is_pair is_string is_value)) (Scope::EE') ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsEE3. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsE. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_RF to _ _ _ Ev1. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsE. Subgoal 1.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 2.1: Variables: FE EE' I IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ is_value (intVal I)
< case IsE. Subgoal 2.1: Variables: FE EE' I IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ H1 : is_integer I ============================ is_value (intVal I)
< search. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ is_value (intVal I)
< case IsE. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_value (intVal I)
< IsI1: apply IH_V_E to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) ============================ is_value (intVal I)
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value (intVal I)
< IsI2: apply IH_V_E to _ _ _ Ev2. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) ============================ is_value (intVal I)
< case IsI1. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) H4 : is_integer I1 ============================ is_value (intVal I)
< case IsI2. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 ============================ is_value (intVal I)
< apply plus_integer_is_integer to _ _ Ev3. Subgoal 2.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 H6 : is_integer I ============================ is_value (intVal I)
< search. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ is_value (intVal I)
< case IsE. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_value (intVal I)
< IsI1: apply IH_V_E to _ _ _ Ev1. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) ============================ is_value (intVal I)
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value (intVal I)
< IsI2: apply IH_V_E to _ _ _ Ev2. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) ============================ is_value (intVal I)
< case IsI1. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) H4 : is_integer I1 ============================ is_value (intVal I)
< case IsI2. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 ============================ is_value (intVal I)
< apply minus_integer_is_integer to _ _ Ev3. Subgoal 2.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 H6 : is_integer I ============================ is_value (intVal I)
< search. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ is_value (intVal I)
< case IsE. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_value (intVal I)
< IsI1: apply IH_V_E to _ _ _ Ev1. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) ============================ is_value (intVal I)
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value (intVal I)
< IsI2: apply IH_V_E to _ _ _ Ev2. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) ============================ is_value (intVal I)
< case IsI1. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) H4 : is_integer I1 ============================ is_value (intVal I)
< case IsI2. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 ============================ is_value (intVal I)
< apply multiply_integer_is_integer to _ _ Ev3. Subgoal 2.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 H6 : is_integer I ============================ is_value (intVal I)
< search. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ is_value (intVal I)
< case IsE. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_value (intVal I)
< IsI1: apply IH_V_E to _ _ _ Ev1. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) ============================ is_value (intVal I)
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value (intVal I)
< IsI2: apply IH_V_E to _ _ _ Ev2. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (intVal I1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) ============================ is_value (intVal I)
< case IsI1. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (intVal I2) H4 : is_integer I1 ============================ is_value (intVal I)
< case IsI2. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 ============================ is_value (intVal I)
< apply divide_integer_is_integer to _ _ Ev3. Subgoal 2.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer I1 H5 : is_integer I2 H6 : is_integer I ============================ is_value (intVal I)
< search. Subgoal 2.6: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ is_value trueVal
< search. Subgoal 2.7: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ is_value falseVal
< search. Subgoal 2.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value trueVal
< search. Subgoal 2.9: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ is_value falseVal
< search. Subgoal 2.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value falseVal
< search. Subgoal 2.11: Variables: FE EE EE' O E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ is_value trueVal
< search. Subgoal 2.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value trueVal
< search. Subgoal 2.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value falseVal
< search. Subgoal 2.14: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ is_value trueVal
< search. Subgoal 2.15: Variables: FE EE EE' O E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ is_value falseVal
< search. Subgoal 2.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ is_value trueVal
< search. Subgoal 2.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ is_value falseVal
< search. Subgoal 2.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value trueVal
< search. Subgoal 2.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ is_value falseVal
< search. Subgoal 2.20: Variables: FE EE' S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ is_value (stringVal S)
< case IsE. Subgoal 2.20: Variables: FE EE' S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ H1 : is_string S ============================ is_value (stringVal S)
< search. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ is_value (stringVal S)
< case IsE. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_value (stringVal S)
< IsI1: apply IH_V_E to _ _ _ Ev1. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (stringVal S1) ============================ is_value (stringVal S)
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (stringVal S1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value (stringVal S)
< IsI2: apply IH_V_E to _ _ _ Ev2. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsI1 : is_value (stringVal S1) H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (stringVal S2) ============================ is_value (stringVal S)
< case IsI1. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsI2 : is_value (stringVal S2) H4 : is_string S1 ============================ is_value (stringVal S)
< case IsI2. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_string S1 H5 : is_string S2 ============================ is_value (stringVal S)
< apply is_string_append to _ _ Ev3. Subgoal 2.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_string S1 H5 : is_string S2 H6 : is_string S ============================ is_value (stringVal S)
< search. Subgoal 2.22: Variables: FE EE' V X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V ============================ is_value V
< case IsE. Subgoal 2.22: Variables: FE EE' V X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V H1 : is_string X ============================ is_value V
< apply lookupScopes_is to _ Ev1. Subgoal 2.22: Variables: FE EE' V X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V H1 : is_string X H2 : is_value V H3 : is_string X ============================ is_value V
< search. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ is_value V
< IsF: apply lookup_is_value_funCtx to _ Ev1. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ is_value V
< IsF: case IsF. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ is_value V
< IsF: case IsF1. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ is_value V
< IsF: case IsF2. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ is_value V
< case IsE. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args ============================ is_value V
< apply IH_V_A to _ _ _ Ev2. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals ============================ is_value V
< apply zip_is to _ _ Ev3. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv ============================ is_value V
< apply IH_C_S to _ _ _ Ev4. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value V
< apply lookupScopes_is to _ Ev6. Subgoal 2.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_value V H7 : is_string RetVar ============================ is_value V
< search. Subgoal 2.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_value V
< Is: case IsE. Subgoal 2.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 ============================ is_value V
< apply IH_C_S to _ _ _ Ev1. Subgoal 2.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value V
< apply IH_V_E to _ _ _ Ev2. Subgoal 2.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O Is : is_stmt S Is1 : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_value V ============================ is_value V
< search. Subgoal 2.25: Variables: FE EE EE' O VF RF IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * ============================ is_value (recVal VF)
< case IsE. Subgoal 2.25: Variables: FE EE EE' O VF RF IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ is_value (recVal VF)
< apply IH_V_RF to _ _ _ Ev1. Subgoal 2.25: Variables: FE EE EE' O VF RF IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF H2 : is_list (is_pair is_string is_value) VF ============================ is_value (recVal VF)
< search. Subgoal 2.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ is_value V
< Is: case IsE. Subgoal 2.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V Is : is_expr Rec Is1 : is_string F ============================ is_value V
< IsRV: apply IH_V_E to _ _ _ Ev1. Subgoal 2.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V Is : is_expr Rec Is1 : is_string F IsRV : is_value (recVal Fields) ============================ is_value V
< case IsRV. Subgoal 2.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V Is : is_expr Rec Is1 : is_string F H1 : is_list (is_pair is_string is_value) Fields ============================ is_value V
< apply lookup_is_value to _ Ev2. Subgoal 2.26: Variables: FE EE EE' V O Fields F Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V Is : is_expr Rec Is1 : is_string F H1 : is_list (is_pair is_string is_value) Fields H2 : is_value V ============================ is_value V
< search. Subgoal 3.1: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalStmt FE EE' noop EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_S to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_S to _ _ _ Ev2. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.3: Variables: FE EE O EE2 Scope V X E Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< case IsS. Subgoal 3.3: Variables: FE EE O EE2 Scope V X E Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< IsC: apply IH_C_E to _ _ _ Ev1. Subgoal 3.3: Variables: FE EE O EE2 Scope V X E Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E IsC : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< apply IH_V_E to _ _ _ Ev1. Subgoal 3.3: Variables: FE EE O EE2 Scope V X E Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E IsC : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) H4 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< case IsC. Subgoal 3.3: Variables: FE EE O EE2 Scope V X E Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_value V H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< search. Subgoal 3.4: Variables: FE EE EE' O V EE3 E X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.4: Variables: FE EE EE' O V EE3 E X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.4: Variables: FE EE EE' O V EE3 E X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev1. Subgoal 3.4: Variables: FE EE EE' O V EE3 E X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply replaceScopes_is to _ _ Ev2. Subgoal 3.4: Variables: FE EE EE' O V EE3 E X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_value V H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< IsRV: apply lookupScopes_is to _ Ev2. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E IsRV : is_value (recVal FieldVals) IsRV1 : is_string Rec ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsRV. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E IsRV1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev1. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E IsRV1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply updateRecFields_is to _ _ _ Ev3. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E IsRV1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_value V H6 : is_list (is_pair is_string is_value) NewVals ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E IsRV1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_value V H6 : is_list (is_pair is_string is_value) NewVals H7 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply replaceScopes_is to _ _ Ev4. Subgoal 3.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E IsRV1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_value V H6 : is_list (is_pair is_string is_value) NewVals H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': apply IH_C_S to _ _ _ Ev2. Subgoal 3.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list (is_list (is_pair is_string is_value)) EE3 Is' : is_list (is_list (is_pair is_string is_value)) (Scope::EE') ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case Is'. Subgoal 3.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': apply IH_C_S to _ _ _ Ev2. Subgoal 3.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list (is_list (is_pair is_string is_value)) EE3 Is' : is_list (is_list (is_pair is_string is_value)) (Scope::EE') ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case Is'. Subgoal 3.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< IsEE4+: apply IH_C_S to _ _ _ Ev2. Subgoal 3.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list (is_list (is_pair is_string is_value)) EE2 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsEE4+. Subgoal 3.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_S to _ _ _ Ev3. Subgoal 3.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.9: Variables: FE EE EE' O Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.9: Variables: FE EE EE' O Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.9: Variables: FE EE EE' O Body Cond IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.10: Variables: FE EE EE' O Scope S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.10: Variables: FE EE EE' O Scope S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: apply IH_C_S to _ _ _ Ev1. Subgoal 3.10: Variables: FE EE EE' O Scope S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 Is : is_list (is_list (is_pair is_string is_value)) (Scope::EE') ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case Is. Subgoal 3.10: Variables: FE EE EE' O Scope S1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.11: Variables: FE EE EE' O I O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.11: Variables: FE EE EE' O I O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.11: Variables: FE EE EE' O I O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.12: Variables: FE EE EE' O O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.12: Variables: FE EE EE' O O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.12: Variables: FE EE EE' O O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.13: Variables: FE EE EE' O O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.13: Variables: FE EE EE' O O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.13: Variables: FE EE EE' O O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.14: Variables: FE EE EE' O S1 O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.14: Variables: FE EE EE' O S1 O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.14: Variables: FE EE EE' O S1 O2 E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 4.1: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsA. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_A to _ _ _ Ev2. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 5.1: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ is_list is_value []
< search. Subgoal 5.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value (V1::VRest)
< case IsA. Subgoal 5.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ is_list is_value (V1::VRest)
< apply IH_C_E to _ _ _ Ev1. Subgoal 5.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value (V1::VRest)
< apply IH_V_E to _ _ _ Ev1. Subgoal 5.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_value V1 ============================ is_list is_value (V1::VRest)
< apply IH_V_A to _ _ _ Ev2. Subgoal 5.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_value V1 H5 : is_list is_value VRest ============================ is_list is_value (V1::VRest)
< search. Subgoal 6.1: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 6.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsRF. Subgoal 6.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 6.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_RF to _ _ _ Ev2. Subgoal 6.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 7.1: Variables: FE EE' IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ is_list (is_pair is_string is_value) []
< search. Subgoal 7.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_pair is_string is_value) ((F, V1)::VRest)
< case IsRF. Subgoal 7.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ is_list (is_pair is_string is_value) ((F, V1)::VRest)
< apply IH_C_E to _ _ _ Ev1. Subgoal 7.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_pair is_string is_value) ((F, V1)::VRest)
< apply IH_V_E to _ _ _ Ev1. Subgoal 7.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value V1 ============================ is_list (is_pair is_string is_value) ((F, V1)::VRest)
< apply IH_V_RF to _ _ _ Ev2. Subgoal 7.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value V1 H6 : is_list (is_pair is_string is_value) VRest ============================ is_list (is_pair is_string is_value) ((F, V1)::VRest)
< search. Proof completed.
< Theorem append_values_is : forall LA LB L, is_list is_value LA -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L. ============================ forall LA LB L, is_list is_value LA -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L
< induction on 1. IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L ============================ forall LA LB L, is_list is_value LA @ -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L
< intros IsA IsB App. Variables: LA LB L IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L IsA : is_list is_value LA @ IsB : is_list is_value LB App : LA ++ LB = L ============================ is_list is_value L
< IsA: case IsA. Subgoal 1: Variables: LB L IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L IsB : is_list is_value LB App : [] ++ LB = L ============================ is_list is_value L
< case App. Subgoal 1: Variables: L IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L IsB : is_list is_value L ============================ is_list is_value L
< search. Subgoal 2: Variables: LB L T H IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L IsB : is_list is_value LB App : H::T ++ LB = L IsA : is_value H IsA1 : is_list is_value T * ============================ is_list is_value L
< App: case App. Subgoal 2: Variables: LB T H L3 IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L IsB : is_list is_value LB IsA : is_value H IsA1 : is_list is_value T * App : T ++ LB = L3 ============================ is_list is_value (H::L3)
< apply IH to IsA1 IsB App. Subgoal 2: Variables: LB T H L3 IH : forall LA LB L, is_list is_value LA * -> is_list is_value LB -> LA ++ LB = L -> is_list is_value L IsB : is_list is_value LB IsA : is_value H IsA1 : is_list is_value T * App : T ++ LB = L3 H1 : is_list is_value L3 ============================ is_list is_value (H::L3)
< search. Proof completed.
< Extensible_Theorem evalExpr_isOutput : forall FE EE EE' E V O, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalExpr FE EE E V EE' O -> is_list is_value O on Ev as IH_E, evalStmt_isOutput : forall FE EE EE' S O, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalStmt FE EE S EE' O -> is_list is_value O on Ev as IH_S, evalArgs_isOutput : forall FE EE EE' A V O, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalArgs FE EE A V EE' O -> is_list is_value O on Ev as IH_A, evalRecFields_isOutput : forall FE EE EE' RF V O, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalRecFields FE EE RF V EE' O -> is_list is_value O on Ev as IH_RF. Subgoal 1.1: Variables: FE EE' I IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ is_list is_value []
< search. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.6: Variables: FE EE' IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ is_list is_value []
< search. Subgoal 1.7: Variables: FE EE' IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ is_list is_value []
< search. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ is_list is_value O
< case IsE. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ is_list is_value O
< case IsE. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ is_list is_value O
< case IsE. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ is_list is_value O
< case IsE. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.20: Variables: FE EE' S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ is_list is_value []
< search. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.22: Variables: FE EE' V X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V ============================ is_list is_value []
< search. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ is_list is_value O
< IsFP: apply lookup_is_value_funCtx to _ Ev1. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ is_list is_value O
< IsF: case IsFP. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ is_list is_value O
< IsF: case IsF1. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ is_list is_value O
< IsF: case IsF2. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ is_list is_value O
< case IsE. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args ============================ is_list is_value O
< apply evalArgs_isValue to _ _ _ Ev2. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals ============================ is_list is_value O
< apply zip_is to _ _ Ev3. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv ============================ is_list is_value O
< apply IH_S to _ _ _ Ev4. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_list is_value O3 ============================ is_list is_value O
< apply IH_A to _ _ _ Ev2. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_list is_value O3 H6 : is_list is_value O2 ============================ is_list is_value O
< apply append_values_is to _ _ Ev5. Subgoal 1.23: Variables: FE EE EE' V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H1 : is_string Fun H2 : is_args Args H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_list is_value O3 H6 : is_list is_value O2 H7 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.24: Variables: FE EE EE' V O EE3 O2 Scope O3 E1 S IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * ============================ is_list is_value O
< case IsE. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ is_list is_value O
< apply IH_RF to _ _ _ Ev1. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.26: Variables: FE EE EE' V O Fields F Rec IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ is_list is_value O
< case IsE. Subgoal 1.26: Variables: FE EE EE' V O Fields F Rec IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.26: Variables: FE EE EE' V O Fields F Rec IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.1: Variables: FE EE' IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalStmt FE EE' noop EE' [] @ ============================ is_list is_value []
< search. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsS. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev2. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.3: Variables: FE EE O EE2 Scope V X E Ty IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ is_list is_value O
< case IsS. Subgoal 2.3: Variables: FE EE O EE2 Scope V X E Ty IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.3: Variables: FE EE O EE2 Scope V X E Ty IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.4: Variables: FE EE EE' O V EE3 E X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ is_list is_value O
< case IsS. Subgoal 2.4: Variables: FE EE EE' O V EE3 E X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.4: Variables: FE EE EE' O V EE3 E X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ is_list is_value O
< case IsS. Subgoal 2.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E H4 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsS. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev2. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list is_value O3 H7 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsS. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev2. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list is_value O3 H7 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ is_list is_value O
< case IsS. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev2. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list is_value O3 ============================ is_list is_value O
< Is: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list is_value O3 Is : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ is_list is_value O
< case Is. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list is_value O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev3. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list is_value O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : is_list is_value O4 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list is_value O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : is_list is_value O4 H9 : is_list is_value O12 ============================ is_list is_value O
< apply append_values_is to _ _ Ev5. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list is_value O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : is_list is_value O4 H9 : is_list is_value O12 H10 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.9: Variables: FE EE EE' O Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * ============================ is_list is_value O
< case IsS. Subgoal 2.9: Variables: FE EE EE' O Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.9: Variables: FE EE EE' O Body Cond IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.10: Variables: FE EE EE' O Scope S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * ============================ is_list is_value O
< case IsS. Subgoal 2.10: Variables: FE EE EE' O Scope S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 ============================ is_list is_value O
< apply IH_S to _ _ _ Ev1. Subgoal 2.10: Variables: FE EE EE' O Scope S1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ is_list is_value O
< case IsS. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : is_list is_value O2 ============================ is_list is_value O
< IsV: apply evalExpr_isValue to _ _ _ Ev1. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : is_list is_value O2 IsV : is_value (intVal I) ============================ is_list is_value O
< case IsV. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : is_list is_value O2 H3 : is_integer I ============================ is_list is_value O
< apply append_values_is to _ _ Ev2. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : is_list is_value O2 H3 : is_integer I H4 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ is_list is_value O
< case IsS. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : is_list is_value O2 ============================ is_list is_value O
< apply append_values_is to _ _ Ev2. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : is_list is_value O2 H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ is_list is_value O
< case IsS. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : is_list is_value O2 ============================ is_list is_value O
< apply append_values_is to _ _ Ev2. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : is_list is_value O2 H3 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ is_list is_value O
< case IsS. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : is_list is_value O2 H3 : is_value (stringVal S1) ============================ is_list is_value O
< apply append_values_is to _ _ Ev2. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : is_list is_value O2 H3 : is_value (stringVal S1) H4 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 3.1: Variables: FE EE' IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ is_list is_value []
< search. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsA. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_A to _ _ _ Ev2. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 4.1: Variables: FE EE' IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ is_list is_value []
< search. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsRF. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_RF to _ _ _ Ev2. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list is_value O3 H7 : is_list is_value O ============================ is_list is_value O
< search. Proof completed.
< Extensible_Theorem paramName_is : forall P N, IsP : is_param P -> PN : paramName P N -> is_string N on PN. Variables: N Ty IH : forall P N, is_param P -> paramName P N * -> is_string N IsP : is_param (param N Ty) PN : paramName (param N Ty) N @ ============================ is_string N
< case IsP. Variables: N Ty IH : forall P N, is_param P -> paramName P N * -> is_string N PN : paramName (param N Ty) N @ H1 : is_string N H2 : is_typ Ty ============================ is_string N
< search. Proof completed.
< Theorem paramNames_is : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns -> is_list is_string Ns. ============================ forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns -> is_list is_string Ns
< induction on 2. IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns ============================ forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns @ -> is_list is_string Ns
< intros IsPs PN. Variables: Ps Ns IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns IsPs : is_list is_param Ps PN : paramNames Ps Ns @ ============================ is_list is_string Ns
< PN: case PN. Subgoal 1: IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns IsPs : is_list is_param [] ============================ is_list is_string []
< search. Subgoal 2: Variables: NRest N PRest P IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns IsPs : is_list is_param (P::PRest) PN : paramName P N PN1 : paramNames PRest NRest * ============================ is_list is_string (N::NRest)
< case IsPs. Subgoal 2: Variables: NRest N PRest P IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns PN : paramName P N PN1 : paramNames PRest NRest * H1 : is_param P H2 : is_list is_param PRest ============================ is_list is_string (N::NRest)
< apply paramName_is to _ PN. Subgoal 2: Variables: NRest N PRest P IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns PN : paramName P N PN1 : paramNames PRest NRest * H1 : is_param P H2 : is_list is_param PRest H3 : is_string N ============================ is_list is_string (N::NRest)
< apply IH to _ PN1. Subgoal 2: Variables: NRest N PRest P IH : forall Ps Ns, is_list is_param Ps -> paramNames Ps Ns * -> is_list is_string Ns PN : paramName P N PN1 : paramNames PRest NRest * H1 : is_param P H2 : is_list is_param PRest H3 : is_string N H4 : is_list is_string NRest ============================ is_list is_string (N::NRest)
< search. Proof completed.
< Extensible_Theorem getFunEvalInfo_is : forall F Name RetVar RVVal PNames Body, IsF : is_fun F -> GEFI : getFunEvalInfo F Name RetVar RVVal PNames Body -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body on GEFI. Variables: Name RetVar RVVal PNames Body Params RetTy IH : forall F Name RetVar RVVal PNames Body, is_fun F -> getFunEvalInfo F Name RetVar RVVal PNames Body * -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body IsF : is_fun (fun Name RetTy RetVar RVVal Params Body) GEFI : getFunEvalInfo (fun Name RetTy RetVar RVVal Params Body) Name RetVar RVVal PNames Body @ GEFI1 : paramNames Params PNames ============================ (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body
< case IsF. Variables: Name RetVar RVVal PNames Body Params RetTy IH : forall F Name RetVar RVVal PNames Body, is_fun F -> getFunEvalInfo F Name RetVar RVVal PNames Body * -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body GEFI : getFunEvalInfo (fun Name RetTy RetVar RVVal Params Body) Name RetVar RVVal PNames Body @ GEFI1 : paramNames Params PNames H1 : is_string Name H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body ============================ (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body
< apply paramNames_is to _ GEFI1. Variables: Name RetVar RVVal PNames Body Params RetTy IH : forall F Name RetVar RVVal PNames Body, is_fun F -> getFunEvalInfo F Name RetVar RVVal PNames Body * -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body GEFI : getFunEvalInfo (fun Name RetTy RetVar RVVal Params Body) Name RetVar RVVal PNames Body @ GEFI1 : paramNames Params PNames H1 : is_string Name H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body H7 : is_list is_string PNames ============================ (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body
< search. Proof completed.
< Theorem getFunEvalCtx_is : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx. ============================ forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx
< induction on 2. IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx ============================ forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx
< intros IsFs GEFC. Variables: Fs Ctx IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx IsFs : is_list is_fun Fs GEFC : getFunEvalCtx Fs Ctx @ ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx
< GEFC: case GEFC. Subgoal 1: IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx IsFs : is_list is_fun [] ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) []
< search. Subgoal 2: Variables: CRest Body PNames RVVal RetVar FName FRest F IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx IsFs : is_list is_fun (F::FRest) GEFC : getFunEvalInfo F FName RetVar RVVal PNames Body GEFC1 : getFunEvalCtx FRest CRest * ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) ((FName, (RetVar, (RVVal, (PNames, Body))))::CRest)
< case IsFs. Subgoal 2: Variables: CRest Body PNames RVVal RetVar FName FRest F IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx GEFC : getFunEvalInfo F FName RetVar RVVal PNames Body GEFC1 : getFunEvalCtx FRest CRest * H1 : is_fun F H2 : is_list is_fun FRest ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) ((FName, (RetVar, (RVVal, (PNames, Body))))::CRest)
< apply getFunEvalInfo_is to _ GEFC. Subgoal 2: Variables: CRest Body PNames RVVal RetVar FName FRest F IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx GEFC : getFunEvalInfo F FName RetVar RVVal PNames Body GEFC1 : getFunEvalCtx FRest CRest * H1 : is_fun F H2 : is_list is_fun FRest H3 : is_string FName H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_string PNames H7 : is_stmt Body ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) ((FName, (RetVar, (RVVal, (PNames, Body))))::CRest)
< apply IH to _ GEFC1. Subgoal 2: Variables: CRest Body PNames RVVal RetVar FName FRest F IH : forall Fs Ctx, is_list is_fun Fs -> getFunEvalCtx Fs Ctx * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) Ctx GEFC : getFunEvalInfo F FName RetVar RVVal PNames Body GEFC1 : getFunEvalCtx FRest CRest * H1 : is_fun F H2 : is_list is_fun FRest H3 : is_string FName H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_string PNames H7 : is_stmt Body H8 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) CRest ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) ((FName, (RetVar, (RVVal, (PNames, Body))))::CRest)
< search. Proof completed.
< Extensible_Theorem evalProgram_isOutput : forall A P O, IsP : is_program P -> IsA : is_list is_value A -> Ev : evalProgram A P O -> is_list is_value O on Ev. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_program P -> is_list is_value A -> evalProgram A P O * -> is_list is_value O IsP : is_program (program Funs Main) IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O ============================ is_list is_value O
< Is: case IsP. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_program P -> is_list is_value A -> evalProgram A P O * -> is_list is_value O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O Is : is_list is_fun Funs Is1 : is_fun Main ============================ is_list is_value O
< apply getFunEvalInfo_is to _ Ev2. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_program P -> is_list is_value A -> evalProgram A P O * -> is_list is_value O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O Is : is_list is_fun Funs Is1 : is_fun Main H1 : is_string MainName H2 : is_string RetVar H3 : is_value RetVal H4 : is_list is_string PNames H5 : is_stmt Body ============================ is_list is_value O
< apply zip_is to _ _ Ev3. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_program P -> is_list is_value A -> evalProgram A P O * -> is_list is_value O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O Is : is_list is_fun Funs Is1 : is_fun Main H1 : is_string MainName H2 : is_string RetVar H3 : is_value RetVal H4 : is_list is_string PNames H5 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv ============================ is_list is_value O
< apply getFunEvalCtx_is to _ Ev1. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_program P -> is_list is_value A -> evalProgram A P O * -> is_list is_value O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O Is : is_list is_fun Funs Is1 : is_fun Main H1 : is_string MainName H2 : is_string RetVar H3 : is_value RetVal H4 : is_list is_string PNames H5 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx ============================ is_list is_value O
< apply evalStmt_isOutput to _ _ _ Ev4. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_program P -> is_list is_value A -> evalProgram A P O * -> is_list is_value O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O Is : is_list is_fun Funs Is1 : is_fun Main H1 : is_string MainName H2 : is_string RetVar H3 : is_value RetVal H4 : is_list is_string PNames H5 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx H8 : is_list is_value O ============================ is_list is_value O
< search. Proof completed.
< Define names_same : (list (list (pair (string) ItemA))) -> (list (list (pair (string) ItemB))) -> prop by names_same [] []; names_same (A::ARest) (B::BRest) := ((forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B) /\ (forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A)) /\ names_same ARest BRest.
< Theorem names_same_symmetric [A, B] : forall (A : list (list (pair (string) A))) (B : list (list (pair (string) B))), names_same A B -> names_same B A. ============================ forall A B, names_same A B -> names_same B A
< induction on 1. IH : forall A B, names_same A B * -> names_same B A ============================ forall A B, names_same A B @ -> names_same B A
< intros NS. Variables: A B IH : forall A B, names_same A B * -> names_same B A NS : names_same A B @ ============================ names_same B A
< NS: case NS. Subgoal 1: IH : forall A B, names_same A B * -> names_same B A ============================ names_same [] []
< search. Subgoal 2: Variables: BRest B1 ARest A1 IH : forall A B, names_same A B * -> names_same B A NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * ============================ names_same (B1::BRest) (A1::ARest)
< apply IH to NS2. Subgoal 2: Variables: BRest B1 ARest A1 IH : forall A B, names_same A B * -> names_same B A NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * H1 : names_same BRest ARest ============================ names_same (B1::BRest) (A1::ARest)
< search. Proof completed.
< Theorem names_same_reflexive : forall L, is_list (is_list (is_pair is_string is_value)) L -> names_same L L. ============================ forall L, is_list (is_list (is_pair is_string is_value)) L -> names_same L L
< induction on 1. IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> names_same L L ============================ forall L, is_list (is_list (is_pair is_string is_value)) L @ -> names_same L L
< intros IsL. Variables: L IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> names_same L L IsL : is_list (is_list (is_pair is_string is_value)) L @ ============================ names_same L L
< IsL: case IsL. Subgoal 1: IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> names_same L L ============================ names_same [] []
< search. Subgoal 2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> names_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * ============================ names_same (H::T) (H::T)
< apply IH to IsL1. Subgoal 2: Variables: T H IH : forall L, is_list (is_list (is_pair is_string is_value)) L * -> names_same L L IsL : is_list (is_pair is_string is_value) H * IsL1 : is_list (is_list (is_pair is_string is_value)) T * H1 : names_same T T ============================ names_same (H::T) (H::T)
< search. Proof completed.
< Theorem names_same_transitive [ItemA, ItemB, ItemC] : forall (A : list (list (pair (string) ItemA))) (B : list (list (pair (string) ItemB))) (C : list (list (pair (string) ItemC))), names_same A B -> names_same B C -> names_same A C. ============================ forall A B C, names_same A B -> names_same B C -> names_same A C
< induction on 1. IH : forall A B C, names_same A B * -> names_same B C -> names_same A C ============================ forall A B C, names_same A B @ -> names_same B C -> names_same A C
< intros NAB NBC. Variables: A B C IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : names_same A B @ NBC : names_same B C ============================ names_same A C
< NAB: case NAB. Subgoal 1: Variables: C IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NBC : names_same [] C ============================ names_same [] C
< case NBC. Subgoal 1: IH : forall A B C, names_same A B * -> names_same B C -> names_same A C ============================ names_same [] []
< search. Subgoal 2: Variables: C BRest B1 ARest A1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NBC : names_same (B1::BRest) C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * ============================ names_same (A1::ARest) C
< NBC: case NBC. Subgoal 2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) B2 NBC1 : forall X IB, mem (X, IB) B2 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest BRest1 ============================ names_same (A1::ARest) (B2::BRest1)
< rename B2 to C1. Subgoal 2: Variables: BRest B1 ARest A1 BRest1 C1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest BRest1 ============================ names_same (A1::ARest) (C1::BRest1)
< rename BRest1 to CRest. Subgoal 2: Variables: BRest B1 ARest A1 CRest C1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest ============================ names_same (A1::ARest) (C1::CRest)
< unfold . Subgoal 2.1: Variables: BRest B1 ARest A1 CRest C1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest ============================ forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) C1
< intros MA. Subgoal 2.1: Variables: BRest B1 ARest A1 CRest C1 X IA IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest MA : mem (X, IA) A1 ============================ exists IB, mem (X, IB) C1
< MB: apply NAB to MA. Subgoal 2.1: Variables: BRest B1 ARest A1 CRest C1 X IA IB IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest MA : mem (X, IA) A1 MB : mem (X, IB) B1 ============================ exists IB, mem (X, IB) C1
< apply NBC to MB. Subgoal 2.1: Variables: BRest B1 ARest A1 CRest C1 X IA IB IB1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest MA : mem (X, IA) A1 MB : mem (X, IB) B1 H1 : mem (X, IB1) C1 ============================ exists IB, mem (X, IB) C1
< search. Subgoal 2.2: Variables: BRest B1 ARest A1 CRest C1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest ============================ forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) A1
< intros MC. Subgoal 2.2: Variables: BRest B1 ARest A1 CRest C1 X IB IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest MC : mem (X, IB) C1 ============================ exists IA, mem (X, IA) A1
< MB: apply NBC1 to MC. Subgoal 2.2: Variables: BRest B1 ARest A1 CRest C1 X IB IA IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest MC : mem (X, IB) C1 MB : mem (X, IA) B1 ============================ exists IA, mem (X, IA) A1
< apply NAB1 to MB. Subgoal 2.2: Variables: BRest B1 ARest A1 CRest C1 X IB IA IA1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest MC : mem (X, IB) C1 MB : mem (X, IA) B1 H1 : mem (X, IA1) A1 ============================ exists IA, mem (X, IA) A1
< search. Subgoal 2.3: Variables: BRest B1 ARest A1 CRest C1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest ============================ names_same ARest CRest
< apply IH to NAB2 NBC2. Subgoal 2.3: Variables: BRest B1 ARest A1 CRest C1 IH : forall A B C, names_same A B * -> names_same B C -> names_same A C NAB : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NAB1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NAB2 : names_same ARest BRest * NBC : forall X IA, mem (X, IA) B1 -> exists IB, mem (X, IB) C1 NBC1 : forall X IB, mem (X, IB) C1 -> exists IA, mem (X, IA) B1 NBC2 : names_same BRest CRest H1 : names_same ARest CRest ============================ names_same ARest CRest
< search. Proof completed.
< Theorem names_same_names [ItemA, ItemB] : forall (A : list (list (pair (string) ItemA))) (B : list (list (pair (string) ItemB))) NA NB X, names_same A B -> names A NA -> names B NB -> mem X NA -> mem X NB. ============================ forall A B NA NB X, names_same A B -> names A NA -> names B NB -> mem X NA -> mem X NB
< induction on 1. IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB ============================ forall A B NA NB X, names_same A B @ -> names A NA -> names B NB -> mem X NA -> mem X NB
< intros NS NA NB M. Variables: A B NA NB X IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB NS : names_same A B @ NA : names A NA NB : names B NB M : mem X NA ============================ mem X NB
< NS: case NS. Subgoal 1: Variables: NA NB X IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB NA : names [] NA NB : names [] NB M : mem X NA ============================ mem X NB
< case NA. Subgoal 1: Variables: NB X IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB NB : names [] NB M : mem X [] ============================ mem X NB
< case M. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB NA : names (A1::ARest) NA NB : names (B1::BRest) NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * ============================ mem X NB
< NA: case NA. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 NScope NRest IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB NB : names (B1::BRest) NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA ============================ mem X NB
< NB: case NB. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB ============================ mem X NB
< Or: apply mem_append to M NA2. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB Or : mem X NScope \/ mem X NRest ============================ mem X NB
< M': case Or. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NScope ============================ mem X NB
< MA1: apply mem_domain to NA M'. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NScope MA1 : mem (X, B2) A1 ============================ mem X NB
< MB1: apply NS to MA1. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IB IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NScope MA1 : mem (X, B2) A1 MB1 : mem (X, IB) B1 ============================ mem X NB
< M'': apply domain_mem to MB1 NB. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IB IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NScope MA1 : mem (X, B2) A1 MB1 : mem (X, IB) B1 M'' : mem X NScope1 ============================ mem X NB
< apply mem_append_left to M'' NB2. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IB IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NScope MA1 : mem (X, B2) A1 MB1 : mem (X, IB) B1 M'' : mem X NScope1 H1 : mem X NB ============================ mem X NB
< search. Subgoal 2.2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NRest ============================ mem X NB
< M'': apply IH to NS2 NA1 NB1 M'. Subgoal 2.2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NRest M'' : mem X NRest1 ============================ mem X NB
< apply mem_append_right to M'' NB2. Subgoal 2.2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NA -> mem X NB M : mem X NA NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NA : domain A1 NScope NA1 : names ARest NRest NA2 : NScope ++ NRest = NA NB : domain B1 NScope1 NB1 : names BRest NRest1 NB2 : NScope1 ++ NRest1 = NB M' : mem X NRest M'' : mem X NRest1 H1 : mem X NB ============================ mem X NB
< search. Proof completed.
< Theorem names_same_names_back [ItemA, ItemB] : forall (A : list (list (pair (string) ItemA))) (B : list (list (pair (string) ItemB))) NA NB X, names_same A B -> names A NA -> names B NB -> mem X NB -> mem X NA. ============================ forall A B NA NB X, names_same A B -> names A NA -> names B NB -> mem X NB -> mem X NA
< induction on 1. IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA ============================ forall A B NA NB X, names_same A B @ -> names A NA -> names B NB -> mem X NB -> mem X NA
< intros NS NA NB M. Variables: A B NA NB X IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA NS : names_same A B @ NA : names A NA NB : names B NB M : mem X NB ============================ mem X NA
< NS: case NS. Subgoal 1: Variables: NA NB X IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA NA : names [] NA NB : names [] NB M : mem X NB ============================ mem X NA
< case NB. Subgoal 1: Variables: NA X IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA NA : names [] NA M : mem X [] ============================ mem X NA
< case M. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA NA : names (A1::ARest) NA NB : names (B1::BRest) NB M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * ============================ mem X NA
< NB: case NB. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 NScope NRest IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA NA : names (A1::ARest) NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB ============================ mem X NA
< NA: case NA. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA ============================ mem X NA
< Or: apply mem_append to M NB2. Subgoal 2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA Or : mem X NScope \/ mem X NRest ============================ mem X NA
< M': case Or. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NScope ============================ mem X NA
< MB1: apply mem_domain to NB M'. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NScope MB1 : mem (X, B2) B1 ============================ mem X NA
< MA1: apply NS1 to MB1. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IA IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NScope MB1 : mem (X, B2) B1 MA1 : mem (X, IA) A1 ============================ mem X NA
< M'': apply domain_mem to MA1 NA. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IA IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NScope MB1 : mem (X, B2) B1 MA1 : mem (X, IA) A1 M'' : mem X NScope1 ============================ mem X NA
< apply mem_append_left to M'' NA2. Subgoal 2.1: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 B2 IA IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NScope MB1 : mem (X, B2) B1 MA1 : mem (X, IA) A1 M'' : mem X NScope1 H1 : mem X NA ============================ mem X NA
< search. Subgoal 2.2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NRest ============================ mem X NA
< M'': apply IH to NS2 NA1 NB1 M'. Subgoal 2.2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NRest M'' : mem X NRest1 ============================ mem X NA
< apply mem_append_right to M'' NA2. Subgoal 2.2: Variables: NA NB X BRest B1 ARest A1 NScope NRest NScope1 NRest1 IH : forall A B NA NB X, names_same A B * -> names A NA -> names B NB -> mem X NB -> mem X NA M : mem X NB NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * NB : domain B1 NScope NB1 : names BRest NRest NB2 : NScope ++ NRest = NB NA : domain A1 NScope1 NA1 : names ARest NRest1 NA2 : NScope1 ++ NRest1 = NA M' : mem X NRest M'' : mem X NRest1 H1 : mem X NA ============================ mem X NA
< search. Proof completed.
< Theorem replaceScopes_names_same : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R -> names_same L R. ============================ forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R -> names_same L R
< induction on 2. IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R ============================ forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R @ -> names_same L R
< intros IsL R. Variables: L K I R IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) L R : replaceScopes K I L R @ ============================ names_same L R
< R: case R. Subgoal 1: Variables: K I I1 Rest LRemain L1 IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain ============================ names_same (L1::Rest) (((K, I)::LRemain)::Rest)
< unfold . Subgoal 1.1: Variables: K I I1 Rest LRemain L1 IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain ============================ forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) ((K, I)::LRemain)
< intros M. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< case IsL. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< IsX: apply mem_is to _ M. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_pair is_string is_value (X, IA) ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< IsX: case IsX. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< IsK: apply mem_is to _ R. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_pair is_string is_value (K, I1) ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< IsK: case IsK. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< Or: apply is_string_eq_or_not to IsK IsX. Subgoal 1.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 Or : K = X \/ (K = X -> false) ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< E: case Or. Subgoal 1.1.1: Variables: I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (X, I1) L1 R1 : remove_all L1 X LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string X IsK1 : is_value I1 ============================ exists IB, mem (X, IB) ((X, I)::LRemain)
< search. Subgoal 1.1.2: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 E : K = X -> false ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< apply mem_before_remove_all_after to R1 M _. Subgoal 1.1.2.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 E : K = X -> false ============================ X = K -> false
< intros Eq. Subgoal 1.1.2.1: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 E : K = X -> false Eq : X = K ============================ false
< case Eq. Subgoal 1.1.2.1: Variables: K I I1 Rest LRemain L1 IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (K, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string K IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 E : K = K -> false ============================ false
< backchain E. Subgoal 1.1.2: Variables: K I I1 Rest LRemain L1 X IA IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IA) L1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X IsX1 : is_value IA IsK : is_string K IsK1 : is_value I1 E : K = X -> false H3 : mem (X, IA) LRemain ============================ exists IB, mem (X, IB) ((K, I)::LRemain)
< search. Subgoal 1.2: Variables: K I I1 Rest LRemain L1 IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain ============================ forall X IB, mem (X, IB) ((K, I)::LRemain) -> exists IA, mem (X, IA) L1
< intros M. Subgoal 1.2: Variables: K I I1 Rest LRemain L1 X IB IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IB) ((K, I)::LRemain) ============================ exists IA, mem (X, IA) L1
< M: case M. Subgoal 1.2.1: Variables: K I I1 Rest LRemain L1 IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain ============================ exists IA, mem (K, IA) L1
< search. Subgoal 1.2.2: Variables: K I I1 Rest LRemain L1 X IB IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IB) LRemain ============================ exists IA, mem (X, IA) L1
< apply mem_after_remove_all_before to R1 M. Subgoal 1.2.2: Variables: K I I1 Rest LRemain L1 X IB IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain M : mem (X, IB) LRemain H1 : mem (X, IB) L1 ============================ exists IA, mem (X, IA) L1
< search. Subgoal 1.3: Variables: K I I1 Rest LRemain L1 IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : mem (K, I1) L1 R1 : remove_all L1 K LRemain ============================ names_same Rest Rest
< Is: case IsL. Subgoal 1.3: Variables: K I I1 Rest LRemain L1 IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : mem (K, I1) L1 R1 : remove_all L1 K LRemain Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest ============================ names_same Rest Rest
< backchain names_same_reflexive. Subgoal 2: Variables: K I New L1 Rest IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) R : no_lookup L1 K R1 : replaceScopes K I Rest New * ============================ names_same (L1::Rest) (L1::New)
< case IsL. Subgoal 2: Variables: K I New L1 Rest IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : no_lookup L1 K R1 : replaceScopes K I Rest New * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ names_same (L1::Rest) (L1::New)
< apply IH to _ R1. Subgoal 2: Variables: K I New L1 Rest IH : forall L K I R, is_list (is_list (is_pair is_string is_value)) L -> replaceScopes K I L R * -> names_same L R R : no_lookup L1 K R1 : replaceScopes K I Rest New * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : names_same Rest New ============================ names_same (L1::Rest) (L1::New)
< search. Proof completed.
< Theorem names_same_add_scope [I, V] : forall (A : list (list (pair (string) I))) (B : list (list (pair (string) V))), names_same A B -> names_same ([]::A) ([]::B). ============================ forall A B, names_same A B -> names_same ([]::A) ([]::B)
< intros NS. Variables: A B NS : names_same A B ============================ names_same ([]::A) ([]::B)
< unfold . Subgoal 1: Variables: A B NS : names_same A B ============================ forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
< intros M. Subgoal 1: Variables: A B X IA NS : names_same A B M : mem (X, IA) [] ============================ exists IB, mem (X, IB) []
< case M. Subgoal 2: Variables: A B NS : names_same A B ============================ forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
< intros M. Subgoal 2: Variables: A B X IB NS : names_same A B M : mem (X, IB) [] ============================ exists IA, mem (X, IA) []
< case M. Subgoal 3: Variables: A B NS : names_same A B ============================ names_same A B
< search. Proof completed.
< Extensible_Theorem evalExpr_names_same : forall E FE EE V EE' O, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalExpr FE EE E V EE' O -> names_same EE EE' on Ev as IH_E, evalStmt_names_same : forall S FE Scope EE EE' O, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> Ev : evalStmt FE (Scope::EE) S EE' O -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' on Ev as IH_S, evalArgs_names_same : forall A FE EE V EE' O, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalArgs FE EE A V EE' O -> names_same EE EE' on Ev as IH_A, evalRecFields_names_same : forall RF FE EE V EE' O, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalRecFields FE EE RF V EE' O -> names_same EE EE' on Ev as IH_RF. Subgoal 1.1: Variables: FE EE' I IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.6: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 1.7: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ names_same EE EE'
< case IsE. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 H3 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ names_same EE EE'
< case IsE. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 H3 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ names_same EE EE'
< case IsE. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ names_same EE EE'
< case IsE. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.20: Variables: FE EE' S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.22: Variables: FE V EE' X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ names_same EE EE'
< case IsE. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ names_same EE EE'
< apply IH_A to _ _ _ Ev2. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args H3 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ names_same EE EE'
< NS_S: apply IH_S to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE V EE' O O2 Scope O3 E1 S Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S (Scope'::EE'') O2 * Ev2 : evalExpr FE (Scope'::EE'') E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 NS_S : names_same EE EE'' ============================ names_same EE EE'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE V EE' O O2 Scope O3 E1 S Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S (Scope'::EE'') O2 * Ev2 : evalExpr FE (Scope'::EE'') E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 NS_S : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ names_same EE EE'
< NS_E: apply IH_E to _ _ _ Ev2. Subgoal 1.24: Variables: FE EE V EE' O O2 Scope O3 E1 S Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S (Scope'::EE'') O2 * Ev2 : evalExpr FE (Scope'::EE'') E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 NS_S : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS_E : names_same (Scope'::EE'') (Scope::EE') ============================ names_same EE EE'
< NS': case NS_E. Subgoal 1.24: Variables: FE EE V EE' O O2 Scope O3 E1 S Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S (Scope'::EE'') O2 * Ev2 : evalExpr FE (Scope'::EE'') E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 NS_S : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS' : forall X IA, mem (X, IA) Scope' -> exists IB, mem (X, IB) Scope NS'1 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope' NS'2 : names_same EE'' EE' ============================ names_same EE EE'
< apply names_same_transitive to NS_S NS'2. Subgoal 1.24: Variables: FE EE V EE' O O2 Scope O3 E1 S Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S (Scope'::EE'') O2 * Ev2 : evalExpr FE (Scope'::EE'') E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 NS_S : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS' : forall X IA, mem (X, IA) Scope' -> exists IB, mem (X, IB) Scope NS'1 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope' NS'2 : names_same EE'' EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * ============================ names_same EE EE'
< case IsE. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ names_same EE EE'
< apply IH_RF to _ _ _ Ev1. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.26: Variables: FE EE V EE' O Fields F Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ names_same EE EE'
< case IsE. Subgoal 1.26: Variables: FE EE V EE' O Fields F Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.26: Variables: FE EE V EE' O Fields F Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 2.1: Variables: FE Scope EE IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) noop (Scope::EE) [] @ ============================ exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_reflexive to IsEE. Subgoal 2.1: Variables: FE Scope EE IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) noop (Scope::EE) [] @ NS : names_same (Scope::EE) (Scope::EE) ============================ exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.1: Variables: FE Scope EE IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) noop (Scope::EE) [] @ H1 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope H2 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope H3 : names_same EE EE ============================ exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.2: Variables: FE Scope EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.2: Variables: FE Scope EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_A: apply IH_S to _ _ _ Ev1. Subgoal 2.2: Variables: FE Scope EE EE' O O2 O3 S2 S1 Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 (Scope'::EE'') O2 * Ev2 : evalStmt FE (Scope'::EE'') S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 NS_A : names_same EE EE'' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 2.2: Variables: FE Scope EE EE' O O2 O3 S2 S1 Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 (Scope'::EE'') O2 * Ev2 : evalStmt FE (Scope'::EE'') S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 NS_A : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_B: apply IH_S to _ _ _ Ev2. Subgoal 2.2: Variables: FE Scope EE O O2 O3 S2 S1 Scope' EE'' Scope'1 EE''1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'1::EE''1) O @ Ev1 : evalStmt FE (Scope::EE) S1 (Scope'::EE'') O2 * Ev2 : evalStmt FE (Scope'::EE'') S2 (Scope'1::EE''1) O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 NS_A : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS_B : names_same EE'' EE''1 ============================ exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< apply names_same_transitive to NS_A NS_B. Subgoal 2.2: Variables: FE Scope EE O O2 O3 S2 S1 Scope' EE'' Scope'1 EE''1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'1::EE''1) O @ Ev1 : evalStmt FE (Scope::EE) S1 (Scope'::EE'') O2 * Ev2 : evalStmt FE (Scope'::EE'') S2 (Scope'1::EE''1) O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 NS_A : names_same EE EE'' H3 : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS_B : names_same EE'' EE''1 H4 : names_same EE EE''1 ============================ exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.3: Variables: FE Scope EE O EE2 Scope1 V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.3: Variables: FE Scope EE O EE2 Scope1 V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.3: Variables: FE Scope EE O EE2 Scope1 V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E NS : names_same (Scope::EE) (Scope1::EE2) ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< NS: case NS. Subgoal 2.3: Variables: FE Scope EE O EE2 Scope1 V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E NS : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 NS1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope NS2 : names_same EE EE2 ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.4: Variables: FE Scope EE EE' O V EE3 E X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.4: Variables: FE Scope EE EE' O V EE3 E X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E: apply IH_E to _ _ _ Ev1. Subgoal 2.4: Variables: FE Scope EE EE' O V EE3 E X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E NS_E : names_same (Scope::EE) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS_E (keep). Subgoal 2.4: Variables: FE Scope EE EE' O V E X BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V (B::BRest) O * Ev2 : replaceScopes X V (B::BRest) EE' H1 : is_string X H2 : is_expr E NS_E : names_same (Scope::EE) (B::BRest) H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.4: Variables: FE Scope EE EE' O V E X BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V (B::BRest) O * Ev2 : replaceScopes X V (B::BRest) EE' H1 : is_string X H2 : is_expr E NS_E : names_same (Scope::EE) (B::BRest) H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest H6 : is_list (is_list (is_pair is_string is_value)) (B::BRest) ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_R: apply replaceScopes_names_same to _ Ev2. Subgoal 2.4: Variables: FE Scope EE EE' O V E X BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V (B::BRest) O * Ev2 : replaceScopes X V (B::BRest) EE' H1 : is_string X H2 : is_expr E NS_E : names_same (Scope::EE) (B::BRest) H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest H6 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_R : names_same (B::BRest) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_transitive to NS_E NS_R. Subgoal 2.4: Variables: FE Scope EE EE' O V E X BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V (B::BRest) O * Ev2 : replaceScopes X V (B::BRest) EE' H1 : is_string X H2 : is_expr E NS_E : names_same (Scope::EE) (B::BRest) H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest H6 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_R : names_same (B::BRest) EE' NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.4: Variables: FE Scope EE O V E X BRest B BRest1 B1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assign X E) (B1::BRest1) O @ Ev1 : evalExpr FE (Scope::EE) E V (B::BRest) O * Ev2 : replaceScopes X V (B::BRest) (B1::BRest1) H1 : is_string X H2 : is_expr E NS_E : names_same (Scope::EE) (B::BRest) H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest H6 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_R : names_same (B::BRest) (B1::BRest1) H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B1 H8 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest1 ============================ exists Scope' EE'', B1::BRest1 = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.5: Variables: FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.5: Variables: FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E: apply IH_E to _ _ _ Ev1. Subgoal 2.5: Variables: FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E NS_E : names_same (Scope::EE) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.5: Variables: FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_R: apply replaceScopes_names_same to _ Ev4. Subgoal 2.5: Variables: FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_R : names_same EE3 EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_transitive to NS_E NS_R. Subgoal 2.5: Variables: FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_R : names_same EE3 EE' NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.5: Variables: FE Scope EE O V EE3 FieldVals NewVals E Fields Rec BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (B::BRest) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_R : names_same EE3 (B::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.6: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.6: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E: apply IH_E to _ _ _ Ev1. Subgoal 2.6: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.6: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_B: apply IH_S to _ _ _ Ev2. Subgoal 2.6: Variables: FE Scope EE O EE3 O2 O3 El Th Cond Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE'' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope'::EE'') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_B : names_same EE3 EE'' ============================ exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< NS: apply names_same_transitive to NS_E NS_B. Subgoal 2.6: Variables: FE Scope EE O EE3 O2 O3 El Th Cond Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE'' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope'::EE'') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_B : names_same EE3 EE'' NS : names_same (Scope::EE) EE'' ============================ exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< case NS. Subgoal 2.6: Variables: FE Scope EE O EE3 O2 O3 El Th Cond Scope' BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope'::(B::BRest)) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_B : names_same EE3 (B::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest ============================ exists Scope' EE''1, B::BRest = Scope'::EE''1 /\ names_same EE EE''1
< search. Subgoal 2.7: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.7: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E: apply IH_E to _ _ _ Ev1. Subgoal 2.7: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.7: Variables: FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_B: apply IH_S to _ _ _ Ev2. Subgoal 2.7: Variables: FE Scope EE O EE3 O2 O3 El Th Cond Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE'' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope'::EE'') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_B : names_same EE3 EE'' ============================ exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< NS: apply names_same_transitive to NS_E NS_B. Subgoal 2.7: Variables: FE Scope EE O EE3 O2 O3 El Th Cond Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE'' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope'::EE'') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_B : names_same EE3 EE'' NS : names_same (Scope::EE) EE'' ============================ exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< case NS. Subgoal 2.7: Variables: FE Scope EE O EE3 O2 O3 El Th Cond Scope' BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope'::(B::BRest)) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El NS_E : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS_B : names_same EE3 (B::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest ============================ exists Scope' EE''1, B::BRest = Scope'::EE''1 /\ names_same EE EE''1
< search. Subgoal 2.8: Variables: FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.8: Variables: FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E: apply IH_E to _ _ _ Ev1. Subgoal 2.8: Variables: FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E : names_same (Scope::EE) EE2 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E': case NS_E. Subgoal 2.8: Variables: FE Scope EE EE' O O2 Scope1 EE4 O3 O4 O12 Body Cond BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.8: Variables: FE Scope EE EE' O O2 Scope1 EE4 O3 O4 O12 Body Cond BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_B: apply IH_S to _ _ _ Ev2. Subgoal 2.8: Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond BRest B Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::EE'') O3 * Ev3 : evalStmt FE EE'' (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B : names_same (B::BRest) EE'' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_B': case NS_B. Subgoal 2.8: Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond BRest B Scope' BRest1 B1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::(B1::BRest1)) O3 * Ev3 : evalStmt FE (B1::BRest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B' : forall X IA, mem (X, IA) B -> exists IB, mem (X, IB) B1 NS_B'1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B NS_B'2 : names_same BRest BRest1 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< IsEE''+: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 2.8: Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond BRest B Scope' BRest1 B1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::(B1::BRest1)) O3 * Ev3 : evalStmt FE (B1::BRest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B' : forall X IA, mem (X, IA) B -> exists IB, mem (X, IB) B1 NS_B'1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B NS_B'2 : names_same BRest BRest1 IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::(B1::BRest1)) ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsEE''+. Subgoal 2.8: Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond BRest B Scope' BRest1 B1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::(B1::BRest1)) O3 * Ev3 : evalStmt FE (B1::BRest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B' : forall X IA, mem (X, IA) B -> exists IB, mem (X, IB) B1 NS_B'1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B NS_B'2 : names_same BRest BRest1 H4 : is_list (is_pair is_string is_value) Scope' H5 : is_list (is_list (is_pair is_string is_value)) (B1::BRest1) ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_W: apply IH_S to _ _ _ Ev3. Subgoal 2.8: Variables: FE Scope EE O O2 O3 O4 O12 Body Cond BRest B Scope' BRest1 B1 Scope'1 EE''1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'1::EE''1) O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::(B1::BRest1)) O3 * Ev3 : evalStmt FE (B1::BRest1) (while Cond Body) (Scope'1::EE''1) O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B' : forall X IA, mem (X, IA) B -> exists IB, mem (X, IB) B1 NS_B'1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B NS_B'2 : names_same BRest BRest1 H4 : is_list (is_pair is_string is_value) Scope' H5 : is_list (is_list (is_pair is_string is_value)) (B1::BRest1) NS_W : names_same BRest1 EE''1 ============================ exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< NS': apply names_same_transitive to NS_E'2 NS_B'2. Subgoal 2.8: Variables: FE Scope EE O O2 O3 O4 O12 Body Cond BRest B Scope' BRest1 B1 Scope'1 EE''1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'1::EE''1) O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::(B1::BRest1)) O3 * Ev3 : evalStmt FE (B1::BRest1) (while Cond Body) (Scope'1::EE''1) O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B' : forall X IA, mem (X, IA) B -> exists IB, mem (X, IB) B1 NS_B'1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B NS_B'2 : names_same BRest BRest1 H4 : is_list (is_pair is_string is_value) Scope' H5 : is_list (is_list (is_pair is_string is_value)) (B1::BRest1) NS_W : names_same BRest1 EE''1 NS' : names_same EE BRest1 ============================ exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_transitive to NS' NS_W. Subgoal 2.8: Variables: FE Scope EE O O2 O3 O4 O12 Body Cond BRest B Scope' BRest1 B1 Scope'1 EE''1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'1::EE''1) O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal (B::BRest) O2 * Ev2 : evalStmt FE ([]::(B::BRest)) Body (Scope'::(B1::BRest1)) O3 * Ev3 : evalStmt FE (B1::BRest1) (while Cond Body) (Scope'1::EE''1) O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body NS_E' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B NS_E'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope NS_E'2 : names_same EE BRest H3 : is_list (is_list (is_pair is_string is_value)) (B::BRest) NS_B' : forall X IA, mem (X, IA) B -> exists IB, mem (X, IB) B1 NS_B'1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B NS_B'2 : names_same BRest BRest1 H4 : is_list (is_pair is_string is_value) Scope' H5 : is_list (is_list (is_pair is_string is_value)) (B1::BRest1) NS_W : names_same BRest1 EE''1 NS' : names_same EE BRest1 NS : names_same EE EE''1 ============================ exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.9: Variables: FE Scope EE EE' O Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.9: Variables: FE Scope EE EE' O Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.9: Variables: FE Scope EE EE' O Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.9: Variables: FE Scope EE O Body Cond BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (while Cond Body) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal (B::BRest) O * H1 : is_expr Cond H2 : is_stmt Body H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.10: Variables: FE Scope EE EE' O Scope1 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.10: Variables: FE Scope EE EE' O Scope1 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_S to _ _ _ Ev1. Subgoal 2.10: Variables: FE Scope EE O S1 Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE'' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope'::EE'') O * H1 : is_stmt S1 NS : names_same (Scope::EE) EE'' ============================ exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< case NS. Subgoal 2.10: Variables: FE Scope EE O S1 Scope' BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (B::BRest) O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope'::(B::BRest)) O * H1 : is_stmt S1 H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H3 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H4 : names_same EE BRest ============================ exists Scope' EE''1, B::BRest = Scope'::EE''1 /\ names_same EE EE''1
< search. Subgoal 2.11: Variables: FE Scope EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.11: Variables: FE Scope EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.11: Variables: FE Scope EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.11: Variables: FE Scope EE O I O2 E BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) E (intVal I) (B::BRest) O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H3 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H4 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.12: Variables: FE Scope EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.12: Variables: FE Scope EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.12: Variables: FE Scope EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.12: Variables: FE Scope EE O O2 E BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) E trueVal (B::BRest) O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H3 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H4 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.13: Variables: FE Scope EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.13: Variables: FE Scope EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.13: Variables: FE Scope EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.13: Variables: FE Scope EE O O2 E BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) E falseVal (B::BRest) O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H3 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H4 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.14: Variables: FE Scope EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.14: Variables: FE Scope EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.14: Variables: FE Scope EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.14: Variables: FE Scope EE O S1 O2 E BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (printVal E) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) (B::BRest) O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H3 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H4 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 3.1: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsA. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_A to _ _ _ Ev2. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 4.1: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsRF. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest NS1 : names_same EE EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_RF to _ _ _ Ev2. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest NS1 : names_same EE EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest NS1 : names_same EE EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H5 : names_same EE EE' ============================ names_same EE EE'
< search. Proof completed.
< Theorem names_same_length [A, B] : forall (A : list (list (pair (string) A))) (B : list (list (pair (string) B))) L, names_same A B -> length A L -> length B L. ============================ forall A B L, names_same A B -> length A L -> length B L
< induction on 2. IH : forall A B L, names_same A B -> length A L * -> length B L ============================ forall A B L, names_same A B -> length A L @ -> length B L
< intros NS L. Variables: A B L IH : forall A B L, names_same A B -> length A L * -> length B L NS : names_same A B L : length A L @ ============================ length B L
< L: case L. Subgoal 1: Variables: B IH : forall A B L, names_same A B -> length A L * -> length B L NS : names_same [] B ============================ length B 0
< case NS. Subgoal 1: IH : forall A B L, names_same A B -> length A L * -> length B L ============================ length [] 0
< search. Subgoal 2: Variables: B L N' Rest A1 IH : forall A B L, names_same A B -> length A L * -> length B L NS : names_same (A1::Rest) B L : length Rest N' * L1 : 1 + N' = L ============================ length B L
< NS: case NS. Subgoal 2: Variables: L N' Rest A1 BRest B1 IH : forall A B L, names_same A B -> length A L * -> length B L L : length Rest N' * L1 : 1 + N' = L NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same Rest BRest ============================ length (B1::BRest) L
< apply IH to NS2 L. Subgoal 2: Variables: L N' Rest A1 BRest B1 IH : forall A B L, names_same A B -> length A L * -> length B L L : length Rest N' * L1 : 1 + N' = L NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same Rest BRest H1 : length BRest N' ============================ length (B1::BRest) L
< search. Proof completed.
< Theorem evalExpr_keep_scopes : forall FE EE E EE' V O N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O -> length EE N -> length EE' N. ============================ forall FE EE E EE' V O N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O -> length EE N -> length EE' N
< intros IsE IsFE IsEE Ev L. Variables: FE EE E EE' V O N IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V EE' O L : length EE N ============================ length EE' N
< NS: apply evalExpr_names_same to _ _ _ Ev. Variables: FE EE E EE' V O N IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V EE' O L : length EE N NS : names_same EE EE' ============================ length EE' N
< apply names_same_length to NS L. Variables: FE EE E EE' V O N IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V EE' O L : length EE N NS : names_same EE EE' H1 : length EE' N ============================ length EE' N
< search. Proof completed.
< Theorem evalStmt_keep_scopes : forall FE Scope EE S EE' N O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O -> length (Scope::EE) N -> length EE' N. ============================ forall FE Scope EE S EE' N O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O -> length (Scope::EE) N -> length EE' N
< intros IsE IsFE IsEE Ev L. Variables: FE Scope EE S EE' N O IsE : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) S EE' O L : length (Scope::EE) N ============================ length EE' N
< NS: apply evalStmt_names_same to _ _ _ Ev. Variables: FE Scope EE S N O Scope' EE'' IsE : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) S (Scope'::EE'') O L : length (Scope::EE) N NS : names_same EE EE'' ============================ length (Scope'::EE'') N
< L: case L. Variables: FE Scope EE S N O Scope' EE'' N' IsE : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) S (Scope'::EE'') O NS : names_same EE EE'' L : length EE N' L1 : 1 + N' = N ============================ length (Scope'::EE'') N
< apply names_same_length to NS L. Variables: FE Scope EE S N O Scope' EE'' N' IsE : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) S (Scope'::EE'') O NS : names_same EE EE'' L : length EE N' L1 : 1 + N' = N H1 : length EE'' N' ============================ length (Scope'::EE'') N
< search. Proof completed.
< Theorem evalArgs_keep_scopes : forall FE EE A EE' Vs O N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O -> length EE N -> length EE' N. ============================ forall FE EE A EE' Vs O N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O -> length EE N -> length EE' N
< intros IsE IsFE IsEE Ev L. Variables: FE EE A EE' Vs O N IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE A Vs EE' O L : length EE N ============================ length EE' N
< NS: apply evalArgs_names_same to _ _ _ Ev. Variables: FE EE A EE' Vs O N IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE A Vs EE' O L : length EE N NS : names_same EE EE' ============================ length EE' N
< apply names_same_length to NS L. Variables: FE EE A EE' Vs O N IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE A Vs EE' O L : length EE N NS : names_same EE EE' H1 : length EE' N ============================ length EE' N
< search. Proof completed.
< Theorem evalRecFields_keep_scopes : forall FE EE RF EE' F O N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF F EE' O -> length EE N -> length EE' N. ============================ forall FE EE RF EE' F O N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF F EE' O -> length EE N -> length EE' N
< intros IsE IsFE IsEE Ev L. Variables: FE EE RF EE' F O N IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE RF F EE' O L : length EE N ============================ length EE' N
< NS: apply evalRecFields_names_same to _ _ _ Ev. Variables: FE EE RF EE' F O N IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE RF F EE' O L : length EE N NS : names_same EE EE' ============================ length EE' N
< apply names_same_length to NS L. Variables: FE EE RF EE' F O N IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE RF F EE' O L : length EE N NS : names_same EE EE' H1 : length EE' N ============================ length EE' N
< search. Proof completed.
< Theorem replaceRecVal_unique : forall F V L A B, replaceRecVal F V L A -> replaceRecVal F V L B -> A = B. ============================ forall F V L A B, replaceRecVal F V L A -> replaceRecVal F V L B -> A = B
< induction on 1. IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B ============================ forall F V L A B, replaceRecVal F V L A @ -> replaceRecVal F V L B -> A = B
< intros A B. Variables: F V L A B IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B A : replaceRecVal F V L A @ B : replaceRecVal F V L B ============================ A = B
< A: case A. Subgoal 1: Variables: F V B Rest VOld IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B B : replaceRecVal F V ((F, VOld)::Rest) B ============================ (F, V)::Rest = B
< B: case B. Subgoal 1.1: Variables: F V Rest VOld IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B ============================ (F, V)::Rest = (F, V)::Rest
< search. Subgoal 1.2: Variables: F V Rest VOld RRest IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B B : F = F -> false B1 : replaceRecVal F V Rest RRest ============================ (F, V)::Rest = (F, VOld)::RRest
< apply B to _. Subgoal 2: Variables: F V B RRest VO O Rest IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B B : replaceRecVal F V ((O, VO)::Rest) B A : F = O -> false A1 : replaceRecVal F V Rest RRest * ============================ (O, VO)::RRest = B
< B: case B. Subgoal 2.1: Variables: V RRest VO O Rest IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B A : O = O -> false A1 : replaceRecVal O V Rest RRest * ============================ (O, VO)::RRest = (O, V)::Rest
< apply A to _. Subgoal 2.2: Variables: F V RRest VO O Rest RRest1 IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B A : F = O -> false A1 : replaceRecVal F V Rest RRest * B : F = O -> false B1 : replaceRecVal F V Rest RRest1 ============================ (O, VO)::RRest = (O, VO)::RRest1
< apply IH to A1 B1. Subgoal 2.2: Variables: F V VO O Rest RRest1 IH : forall F V L A B, replaceRecVal F V L A * -> replaceRecVal F V L B -> A = B A : F = O -> false A1 : replaceRecVal F V Rest RRest1 * B : F = O -> false B1 : replaceRecVal F V Rest RRest1 ============================ (O, VO)::RRest1 = (O, VO)::RRest1
< search. Proof completed.
< Theorem updateRecFields_unique : forall F V L OutA OutB, updateRecFields F V L OutA -> updateRecFields F V L OutB -> OutA = OutB. ============================ forall F V L OutA OutB, updateRecFields F V L OutA -> updateRecFields F V L OutB -> OutA = OutB
< induction on 1. IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB ============================ forall F V L OutA OutB, updateRecFields F V L OutA @ -> updateRecFields F V L OutB -> OutA = OutB
< intros UA UB. Variables: F V L OutA OutB IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : updateRecFields F V L OutA @ UB : updateRecFields F V L OutB ============================ OutA = OutB
< UA: case UA. Subgoal 1: Variables: V L OutA OutB F1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UB : updateRecFields [F1] V L OutB UA : replaceRecVal F1 V L OutA ============================ OutA = OutB
< UB: case UB. Subgoal 1.1: Variables: V L OutA OutB F1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : replaceRecVal F1 V L OutA UB : replaceRecVal F1 V L OutB ============================ OutA = OutB
< apply replaceRecVal_unique to UA UB. Subgoal 1.1: Variables: V L OutB F1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : replaceRecVal F1 V L OutB UB : replaceRecVal F1 V L OutB ============================ OutB = OutB
< search. Subgoal 1.2: Variables: V L OutA OutB F1 Fields Updated IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : replaceRecVal F1 V L OutA UB : lookup L F1 (recVal Fields) UB1 : updateRecFields [] V Fields Updated UB2 : replaceRecVal F1 (recVal Updated) L OutB ============================ OutA = OutB
< case UB1. Subgoal 2: Variables: V L OutA OutB Fields Updated FRest F1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UB : updateRecFields (F1::FRest) V L OutB UA : lookup L F1 (recVal Fields) UA1 : updateRecFields FRest V Fields Updated * UA2 : replaceRecVal F1 (recVal Updated) L OutA ============================ OutA = OutB
< UB: case UB. Subgoal 2.1: Variables: V L OutA OutB Fields Updated F1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : lookup L F1 (recVal Fields) UA1 : updateRecFields [] V Fields Updated * UA2 : replaceRecVal F1 (recVal Updated) L OutA UB : replaceRecVal F1 V L OutB ============================ OutA = OutB
< case UA1. Subgoal 2.2: Variables: V L OutA OutB Fields Updated FRest F1 Fields1 Updated1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : lookup L F1 (recVal Fields) UA1 : updateRecFields FRest V Fields Updated * UA2 : replaceRecVal F1 (recVal Updated) L OutA UB : lookup L F1 (recVal Fields1) UB1 : updateRecFields FRest V Fields1 Updated1 UB2 : replaceRecVal F1 (recVal Updated1) L OutB ============================ OutA = OutB
< apply lookup_unique to UA UB. Subgoal 2.2: Variables: V L OutA OutB Updated FRest F1 Fields1 Updated1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : lookup L F1 (recVal Fields1) UA1 : updateRecFields FRest V Fields1 Updated * UA2 : replaceRecVal F1 (recVal Updated) L OutA UB : lookup L F1 (recVal Fields1) UB1 : updateRecFields FRest V Fields1 Updated1 UB2 : replaceRecVal F1 (recVal Updated1) L OutB ============================ OutA = OutB
< apply IH to UA1 UB1. Subgoal 2.2: Variables: V L OutA OutB FRest F1 Fields1 Updated1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : lookup L F1 (recVal Fields1) UA1 : updateRecFields FRest V Fields1 Updated1 * UA2 : replaceRecVal F1 (recVal Updated1) L OutA UB : lookup L F1 (recVal Fields1) UB1 : updateRecFields FRest V Fields1 Updated1 UB2 : replaceRecVal F1 (recVal Updated1) L OutB ============================ OutA = OutB
< apply replaceRecVal_unique to UA2 UB2. Subgoal 2.2: Variables: V L OutB FRest F1 Fields1 Updated1 IH : forall F V L OutA OutB, updateRecFields F V L OutA * -> updateRecFields F V L OutB -> OutA = OutB UA : lookup L F1 (recVal Fields1) UA1 : updateRecFields FRest V Fields1 Updated1 * UA2 : replaceRecVal F1 (recVal Updated1) L OutB UB : lookup L F1 (recVal Fields1) UB1 : updateRecFields FRest V Fields1 Updated1 UB2 : replaceRecVal F1 (recVal Updated1) L OutB ============================ OutB = OutB
< search. Proof completed.
< Define newNameScopes : (list (list (pair (string) Item))) -> integer -> (list (list (pair (string) Item))) -> (list (list (pair (string) Item))) -> prop by newNameScopes Scopes Len A B := exists N SNames BNames, ((((length B Len /\ drop N A B) /\ take N A Scopes) /\ names Scopes SNames) /\ names B BNames) /\ (forall X, mem X SNames -> mem X BNames -> false); newNameScopes Scopes Len (S::AR) (S::BR) := newNameScopes Scopes Len AR BR.
< Theorem lookupScopes_drop_not_mem : forall X B (V : value) N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V. ============================ forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V
< induction on 4. IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V ============================ forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B @ -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V
< intros IsA IsX L D T NS NB NMems. Variables: X B V N A Scopes SNames BNames IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X L : lookupScopes X B V D : drop N A B @ T : take N A Scopes NS : names Scopes SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false ============================ lookupScopes X A V
< D: case D. Subgoal 1: Variables: X B V Scopes SNames BNames IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X L : lookupScopes X B V T : take 0 B Scopes NS : names Scopes SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false ============================ lookupScopes X B V
< T: case T. Subgoal 1.1: Variables: X B V SNames BNames IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X L : lookupScopes X B V NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false ============================ lookupScopes X B V
< search. Subgoal 1.2: Variables: X V SNames BNames N2 F X1 L IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X (X1::L) V NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F ============================ lookupScopes X (X1::L) V
< GEq: apply take_geq_0 to T1. Subgoal 1.2: Variables: X V SNames BNames N2 F X1 L IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X (X1::L) V NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F GEq : N2 >= 0 ============================ lookupScopes X (X1::L) V
< apply take_is_integer to T1. Subgoal 1.2: Variables: X V SNames BNames N2 F X1 L IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X (X1::L) V NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F GEq : N2 >= 0 H1 : is_integer N2 ============================ lookupScopes X (X1::L) V
< L': apply lt_plus_one to T _. Subgoal 1.2: Variables: X V SNames BNames N2 F X1 L IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X (X1::L) V NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F GEq : N2 >= 0 H1 : is_integer N2 L' : N2 < 0 ============================ lookupScopes X (X1::L) V
< apply greatereq_less_integer_false to GEq L'. Subgoal 2: Variables: X B V N Scopes SNames BNames N2 L X1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V T : take N (X1::L) Scopes NS : names Scopes SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * ============================ lookupScopes X (X1::L) V
< T: case T. Subgoal 2.1: Variables: X B V SNames BNames N2 L X1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * ============================ lookupScopes X (X1::L) V
< GEq: apply drop_geq_0 to D1. Subgoal 2.1: Variables: X B V SNames BNames N2 L X1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * GEq : N2 >= 0 ============================ lookupScopes X (X1::L) V
< apply drop_is_integer to D1. Subgoal 2.1: Variables: X B V SNames BNames N2 L X1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * GEq : N2 >= 0 H1 : is_integer N2 ============================ lookupScopes X (X1::L) V
< L': apply lt_plus_one to D _. Subgoal 2.1: Variables: X B V SNames BNames N2 L X1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * GEq : N2 >= 0 H1 : is_integer N2 L' : N2 < 0 ============================ lookupScopes X (X1::L) V
< apply greatereq_less_integer_false to GEq L'. Subgoal 2.2: Variables: X B V N SNames BNames N2 L X1 N1 F IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NS : names (X1::F) SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F ============================ lookupScopes X (X1::L) V
< NS: case NS. Subgoal 2.2: Variables: X B V N SNames BNames N2 L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames ============================ lookupScopes X (X1::L) V
< apply drop_is_integer to D1. Subgoal 2.2: Variables: X B V N SNames BNames N2 L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N2 ============================ lookupScopes X (X1::L) V
< Is: case IsA. Subgoal 2.2: Variables: X B V N SNames BNames N2 L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N2 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L ============================ lookupScopes X (X1::L) V
< apply take_is_integer to T1. Subgoal 2.2: Variables: X B V N SNames BNames N2 L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N2 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 ============================ lookupScopes X (X1::L) V
< apply plus_integer_unique_addend to _ _ _ D T. Subgoal 2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 ============================ lookupScopes X (X1::L) V
< apply IH to _ _ L D1 T1 NS1 NB _. Subgoal 2.2.1: Variables: X B V N SNames BNames L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 ============================ forall Z, mem Z NRest -> mem Z BNames -> false
< intros MN MB. Subgoal 2.2.1: Variables: X B V N SNames BNames L X1 N1 F NScope NRest Z IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 MN : mem Z NRest MB : mem Z BNames ============================ false
< MS: apply mem_append_right to MN NS2. Subgoal 2.2.1: Variables: X B V N SNames BNames L X1 N1 F NScope NRest Z IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 MN : mem Z NRest MB : mem Z BNames MS : mem Z SNames ============================ false
< apply NMems to MS MB. Subgoal 2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V ============================ lookupScopes X (X1::L) V
< Or: apply lookup_string_value_list_or_no to Is IsX. Subgoal 2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V Or : (exists V, lookup X1 X V) \/ no_lookup X1 X ============================ lookupScopes X (X1::L) V
< L: case Or. Subgoal 2.2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest V1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V L1 : lookup X1 X V1 ============================ lookupScopes X (X1::L) V
< M: apply lookup_mem to L1. Subgoal 2.2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest V1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V L1 : lookup X1 X V1 M : mem (X, V1) X1 ============================ lookupScopes X (X1::L) V
< MNS: apply domain_mem to M NS. Subgoal 2.2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest V1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V L1 : lookup X1 X V1 M : mem (X, V1) X1 MNS : mem X NScope ============================ lookupScopes X (X1::L) V
< MBN: apply lookupScopes_names to L NB. Subgoal 2.2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest V1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V L1 : lookup X1 X V1 M : mem (X, V1) X1 MNS : mem X NScope MBN : mem X BNames ============================ lookupScopes X (X1::L) V
< M': apply mem_append_left to MNS NS2. Subgoal 2.2.2: Variables: X B V N SNames BNames L X1 N1 F NScope NRest V1 IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V L1 : lookup X1 X V1 M : mem (X, V1) X1 MNS : mem X NScope MBN : mem X BNames M' : mem X SNames ============================ lookupScopes X (X1::L) V
< apply NMems to M' MBN. Subgoal 2.2.3: Variables: X B V N SNames BNames L X1 N1 F NScope NRest IH : forall X B V N A Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> lookupScopes X B V -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> lookupScopes X A V IsX : is_string X L : lookupScopes X B V NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 H3 : lookupScopes X L V L1 : no_lookup X1 X ============================ lookupScopes X (X1::L) V
< search. Proof completed.
< Theorem newNameScopes_lookupScopes : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V -> lookupScopes X A V. ============================ forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V -> lookupScopes X A V
< induction on 4. IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V ============================ forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V @ -> lookupScopes X A V
< intros IsA IsX NNS LkpB. Variables: N Len A B X V IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X NNS : newNameScopes N Len A B LkpB : lookupScopes X B V @ ============================ lookupScopes X A V
< L: case LkpB (keep). Subgoal 1: Variables: N Len A X V Rest L IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X NNS : newNameScopes N Len A (L::Rest) LkpB : lookupScopes X (L::Rest) V @ L : lookup L X V ============================ lookupScopes X A V
< NNS: case NNS. Subgoal 1.1: Variables: N Len A X V Rest L N1 SNames BNames IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : lookup L X V NNS : length (L::Rest) Len NNS1 : drop N1 A (L::Rest) NNS2 : take N1 A N NNS3 : names N SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ lookupScopes X A V
< apply lookupScopes_drop_not_mem to _ IsX LkpB NNS1 _ NNS3 NNS4 _. Subgoal 1.1: Variables: N Len A X V Rest L N1 SNames BNames IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : lookup L X V NNS : length (L::Rest) Len NNS1 : drop N1 A (L::Rest) NNS2 : take N1 A N NNS3 : names N SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : lookupScopes X A V ============================ lookupScopes X A V
< search. Subgoal 1.2: Variables: N Len X V Rest L AR IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (L::AR) IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : lookup L X V NNS : newNameScopes N Len AR Rest ============================ lookupScopes X (L::AR) V
< search. Subgoal 2: Variables: N Len A X V Rest L IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X NNS : newNameScopes N Len A (L::Rest) LkpB : lookupScopes X (L::Rest) V @ L : no_lookup L X L1 : lookupScopes X Rest V * ============================ lookupScopes X A V
< NNS: case NNS. Subgoal 2.1: Variables: N Len A X V Rest L N1 SNames BNames IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length (L::Rest) Len NNS1 : drop N1 A (L::Rest) NNS2 : take N1 A N NNS3 : names N SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ lookupScopes X A V
< apply lookupScopes_drop_not_mem to _ IsX LkpB NNS1 _ NNS3 NNS4 _. Subgoal 2.1: Variables: N Len A X V Rest L N1 SNames BNames IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length (L::Rest) Len NNS1 : drop N1 A (L::Rest) NNS2 : take N1 A N NNS3 : names N SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : lookupScopes X A V ============================ lookupScopes X A V
< search. Subgoal 2.2: Variables: N Len X V Rest L AR IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsA : is_list (is_list (is_pair is_string is_value)) (L::AR) IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len AR Rest ============================ lookupScopes X (L::AR) V
< case IsA. Subgoal 2.2: Variables: N Len X V Rest L AR IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len AR Rest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) AR ============================ lookupScopes X (L::AR) V
< apply IH to _ IsX NNS L1. Subgoal 2.2: Variables: N Len X V Rest L AR IH : forall N Len A B X V, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> newNameScopes N Len A B -> lookupScopes X B V * -> lookupScopes X A V IsX : is_string X LkpB : lookupScopes X (L::Rest) V @ L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len AR Rest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) AR H3 : lookupScopes X AR V ============================ lookupScopes X (L::AR) V
< search. Proof completed.
< Theorem replaceScopes_drop_not_mem : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA. ============================ forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA
< induction on 4. IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA ============================ forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B @ -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA
< intros IsA IsX R D T NS NB NMems. Variables: A X V B RB N Scopes SNames BNames IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) A IsX : is_string X R : replaceScopes X V B RB D : drop N A B @ T : take N A Scopes NS : names Scopes SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false ============================ exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA
< D: case D. Subgoal 1: Variables: X V B RB Scopes SNames BNames IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X R : replaceScopes X V B RB T : take 0 B Scopes NS : names Scopes SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false ============================ exists RA, Scopes ++ RB = RA /\ replaceScopes X V B RA
< T: case T. Subgoal 1.1: Variables: X V B RB SNames BNames IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X R : replaceScopes X V B RB NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false ============================ exists RA, [] ++ RB = RA /\ replaceScopes X V B RA
< search. Subgoal 1.2: Variables: X V RB SNames BNames N2 F X1 L IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V (X1::L) RB NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< GEq: apply take_geq_0 to T1. Subgoal 1.2: Variables: X V RB SNames BNames N2 F X1 L IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V (X1::L) RB NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F GEq : N2 >= 0 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply take_is_integer to T1. Subgoal 1.2: Variables: X V RB SNames BNames N2 F X1 L IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V (X1::L) RB NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F GEq : N2 >= 0 H1 : is_integer N2 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< L': apply lt_plus_one to T _. Subgoal 1.2: Variables: X V RB SNames BNames N2 F X1 L IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V (X1::L) RB NS : names (X1::F) SNames NB : names (X1::L) BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false T : 1 + N2 = 0 T1 : take N2 L F GEq : N2 >= 0 H1 : is_integer N2 L' : N2 < 0 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply greatereq_less_integer_false to GEq L'. Subgoal 2: Variables: X V B RB N Scopes SNames BNames N2 L X1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB T : take N (X1::L) Scopes NS : names Scopes SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * ============================ exists RA, Scopes ++ RB = RA /\ replaceScopes X V (X1::L) RA
< T: case T. Subgoal 2.1: Variables: X V B RB SNames BNames N2 L X1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * ============================ exists RA, [] ++ RB = RA /\ replaceScopes X V (X1::L) RA
< GEq: apply drop_geq_0 to D1. Subgoal 2.1: Variables: X V B RB SNames BNames N2 L X1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * GEq : N2 >= 0 ============================ exists RA, [] ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply drop_is_integer to D1. Subgoal 2.1: Variables: X V B RB SNames BNames N2 L X1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * GEq : N2 >= 0 H1 : is_integer N2 ============================ exists RA, [] ++ RB = RA /\ replaceScopes X V (X1::L) RA
< L': apply lt_plus_one to D _. Subgoal 2.1: Variables: X V B RB SNames BNames N2 L X1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NS : names [] SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = 0 D1 : drop N2 L B * GEq : N2 >= 0 H1 : is_integer N2 L' : N2 < 0 ============================ exists RA, [] ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply greatereq_less_integer_false to GEq L'. Subgoal 2.2: Variables: X V B RB N SNames BNames N2 L X1 N1 F IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NS : names (X1::F) SNames NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< NS: case NS. Subgoal 2.2: Variables: X V B RB N SNames BNames N2 L X1 N1 F NScope NRest IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply drop_is_integer to D1. Subgoal 2.2: Variables: X V B RB N SNames BNames N2 L X1 N1 F NScope NRest IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsA : is_list (is_list (is_pair is_string is_value)) (X1::L) IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N2 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< Is: case IsA. Subgoal 2.2: Variables: X V B RB N SNames BNames N2 L X1 N1 F NScope NRest IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N2 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply take_is_integer to T1. Subgoal 2.2: Variables: X V B RB N SNames BNames N2 L X1 N1 F NScope NRest IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N2 = N D1 : drop N2 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N2 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply plus_integer_unique_addend to _ _ _ D T. Subgoal 2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< R': apply IH to _ _ R D1 T1 NS1 NB _. Subgoal 2.2.1: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 ============================ forall Z, mem Z NRest -> mem Z BNames -> false
< intros MN MB. Subgoal 2.2.1: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest Z IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 MN : mem Z NRest MB : mem Z BNames ============================ false
< MS: apply mem_append_right to MN NS2. Subgoal 2.2.1: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest Z IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 MN : mem Z NRest MB : mem Z BNames MS : mem Z SNames ============================ false
< apply NMems to MS MB. Subgoal 2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< Or: apply lookup_string_value_list_or_no to Is IsX. Subgoal 2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA Or : (exists V, lookup X1 X V) \/ no_lookup X1 X ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< L: case Or. Subgoal 2.2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA V1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA L : lookup X1 X V1 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< M: apply lookup_mem to L. Subgoal 2.2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA V1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA L : lookup X1 X V1 M : mem (X, V1) X1 ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< MNS: apply domain_mem to M NS. Subgoal 2.2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA V1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA L : lookup X1 X V1 M : mem (X, V1) X1 MNS : mem X NScope ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< MBN: apply replaceScopes_names to R NB. Subgoal 2.2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA V1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA L : lookup X1 X V1 M : mem (X, V1) X1 MNS : mem X NScope MBN : mem X BNames ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< M': apply mem_append_left to MNS NS2. Subgoal 2.2.2: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA V1 IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA L : lookup X1 X V1 M : mem (X, V1) X1 MNS : mem X NScope MBN : mem X BNames M' : mem X SNames ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< apply NMems to M' MBN. Subgoal 2.2.3: Variables: X V B RB N SNames BNames L X1 N1 F NScope NRest RA IH : forall A X V B RB N Scopes SNames BNames, is_list (is_list (is_pair is_string is_value)) A -> is_string X -> replaceScopes X V B RB -> drop N A B * -> take N A Scopes -> names Scopes SNames -> names B BNames -> (forall Z, mem Z SNames -> mem Z BNames -> false) -> exists RA, Scopes ++ RB = RA /\ replaceScopes X V A RA IsX : is_string X R : replaceScopes X V B RB NB : names B BNames NMems : forall Z, mem Z SNames -> mem Z BNames -> false D : 1 + N1 = N D1 : drop N1 L B * T : 1 + N1 = N T1 : take N1 L F NS : domain X1 NScope NS1 : names F NRest NS2 : NScope ++ NRest = SNames H1 : is_integer N1 Is : is_list (is_pair is_string is_value) X1 Is1 : is_list (is_list (is_pair is_string is_value)) L H2 : is_integer N1 R' : F ++ RB = RA R'1 : replaceScopes X V L RA L : no_lookup X1 X ============================ exists RA, X1::F ++ RB = RA /\ replaceScopes X V (X1::L) RA
< search. Proof completed.
< Theorem replaceScopes_names_forward : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R -> names L LN -> names R RN -> mem Z LN -> mem Z RN. ============================ forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R -> names L LN -> names R RN -> mem Z LN -> mem Z RN
< induction on 3. IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN ============================ forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R @ -> names L LN -> names R RN -> mem Z LN -> mem Z RN
< intros IsL IsX R NL NR M. Variables: X V L R LN RN Z IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) L IsX : is_string X R : replaceScopes X V L R @ NL : names L LN NR : names R RN M : mem Z LN ============================ mem Z RN
< R: case R. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NL : names (L1::Rest) LN NR : names (((X, V)::LRemain)::Rest) RN M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain ============================ mem Z RN
< NL: case NL. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NR : names (((X, V)::LRemain)::Rest) RN M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN ============================ mem Z RN
< NR: case NR. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain ((X, V)::LRemain) NScope1 NR1 : names Rest NRest1 NR2 : NScope1 ++ NRest1 = RN ============================ mem Z RN
< NR: case NR. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest ============================ mem Z RN
< Or: apply mem_append to M NL2. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest Or : mem Z NScope \/ mem Z NRest ============================ mem Z RN
< M': case Or. Subgoal 1.1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope ============================ mem Z RN
< Is: case IsL. Subgoal 1.1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest ============================ mem Z RN
< IsNScope: apply domain_is to _ NL. Subgoal 1.1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope ============================ mem Z RN
< IsZ: apply mem_is_string to _ M'. Subgoal 1.1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z ============================ mem Z RN
< Or: apply is_string_eq_or_not to IsX IsZ. Subgoal 1.1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z Or : X = Z \/ (X = Z -> false) ============================ mem Z RN
< E: case Or. Subgoal 1.1.1: Variables: V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string Z M : mem Z LN R : mem (Z, I) L1 R1 : remove_all L1 Z LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : Z::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z ============================ mem Z RN
< case NR2. Subgoal 1.1.1: Variables: V LN Z I Rest LRemain L1 NScope NRest NRest1 DRest L3 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string Z M : mem Z LN R : mem (Z, I) L1 R1 : remove_all L1 Z LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z H1 : DRest ++ NRest1 = L3 ============================ mem Z (Z::L3)
< search. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z E : X = Z -> false ============================ mem Z RN
< apply remove_all_names to R1 NL NR M' _. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z E : X = Z -> false H1 : mem Z DRest ============================ mem Z RN
< apply mem_append_left to _ NR2 with A = Z. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NScope Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsNScope : is_list is_string NScope IsZ : is_string Z E : X = Z -> false H1 : mem Z DRest H2 : mem Z RN ============================ mem Z RN
< search. Subgoal 1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NRest ============================ mem Z RN
< apply names_unique to NL1 NR1. Subgoal 1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest1 NL2 : NScope ++ NRest1 = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NRest1 ============================ mem Z RN
< apply mem_append_right to M' NR2. Subgoal 1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z LN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest1 NL2 : NScope ++ NRest1 = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NRest1 H1 : mem Z RN ============================ mem Z RN
< search. Subgoal 2: Variables: X V LN RN Z New L1 Rest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NL : names (L1::Rest) LN NR : names (L1::New) RN M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * ============================ mem Z RN
< Is: case IsL. Subgoal 2: Variables: X V LN RN Z New L1 Rest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X NL : names (L1::Rest) LN NR : names (L1::New) RN M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest ============================ mem Z RN
< NL: case NL. Subgoal 2: Variables: X V LN RN Z New L1 Rest NScope NRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X NR : names (L1::New) RN M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN ============================ mem Z RN
< NR: case NR. Subgoal 2: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN ============================ mem Z RN
< Or: apply mem_append to M NL2. Subgoal 2: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN Or : mem Z NScope \/ mem Z NRest ============================ mem Z RN
< M': case Or. Subgoal 2.1: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NScope ============================ mem Z RN
< apply domain_unique to NL NR. Subgoal 2.1: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NScope1 ============================ mem Z RN
< apply mem_append_left to M' NR2. Subgoal 2.1: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NScope1 H1 : mem Z RN ============================ mem Z RN
< search. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest ============================ mem Z RN
< M'': apply IH to _ IsX R1 NL1 NR1 M'. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest M'' : mem Z NRest1 ============================ mem Z RN
< apply mem_append_right to M'' NR2. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z LN -> mem Z RN IsX : is_string X M : mem Z LN R : no_lookup L1 X R1 : replaceScopes X V Rest New * Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest M'' : mem Z NRest1 H1 : mem Z RN ============================ mem Z RN
< search. Proof completed.
< Theorem replaceScopes_names_backward : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R -> names L LN -> names R RN -> mem Z RN -> mem Z LN. ============================ forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R -> names L LN -> names R RN -> mem Z RN -> mem Z LN
< induction on 3. IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN ============================ forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R @ -> names L LN -> names R RN -> mem Z RN -> mem Z LN
< intros IsL IsX R NL NR M. Variables: X V L R LN RN Z IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) L IsX : is_string X R : replaceScopes X V L R @ NL : names L LN NR : names R RN M : mem Z RN ============================ mem Z LN
< R: case R. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NL : names (L1::Rest) LN NR : names (((X, V)::LRemain)::Rest) RN M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain ============================ mem Z LN
< NL: case NL. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NR : names (((X, V)::LRemain)::Rest) RN M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN ============================ mem Z LN
< NR: case NR. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain ((X, V)::LRemain) NScope1 NR1 : names Rest NRest1 NR2 : NScope1 ++ NRest1 = RN ============================ mem Z LN
< NR: case NR. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest ============================ mem Z LN
< Or: apply mem_append to M NR2. Subgoal 1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest Or : mem Z (X::DRest) \/ mem Z NRest1 ============================ mem Z LN
< M': case Or. Subgoal 1.1: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z (X::DRest) ============================ mem Z LN
< M': case M'. Subgoal 1.1.1: Variables: X V LN RN I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem X RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest ============================ mem X LN
< M'': apply domain_mem to R NL. Subgoal 1.1.1: Variables: X V LN RN I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem X RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M'' : mem X NScope ============================ mem X LN
< apply mem_append_left to M'' NL2. Subgoal 1.1.1: Variables: X V LN RN I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem X RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M'' : mem X NScope H1 : mem X LN ============================ mem X LN
< search. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z DRest ============================ mem Z LN
< MLRemain: apply mem_domain to NR M'. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest B IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z DRest MLRemain : mem (Z, B) LRemain ============================ mem Z LN
< ML1: apply mem_after_remove_all_before to R1 MLRemain. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest B IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z DRest MLRemain : mem (Z, B) LRemain ML1 : mem (Z, B) L1 ============================ mem Z LN
< MNScope: apply domain_mem to ML1 NL. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest B IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z DRest MLRemain : mem (Z, B) LRemain ML1 : mem (Z, B) L1 MNScope : mem Z NScope ============================ mem Z LN
< apply mem_append_left to MNScope NL2. Subgoal 1.1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest B IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z DRest MLRemain : mem (Z, B) LRemain ML1 : mem (Z, B) L1 MNScope : mem Z NScope H1 : mem Z LN ============================ mem Z LN
< search. Subgoal 1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NRest1 ============================ mem Z LN
< apply names_unique to NL1 NR1. Subgoal 1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest1 NL2 : NScope ++ NRest1 = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NRest1 ============================ mem Z LN
< apply mem_append_right to M' NL2. Subgoal 1.2: Variables: X V LN RN Z I Rest LRemain L1 NScope NRest1 DRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : mem (X, I) L1 R1 : remove_all L1 X LRemain NL : domain L1 NScope NL1 : names Rest NRest1 NL2 : NScope ++ NRest1 = LN NR1 : names Rest NRest1 NR2 : X::DRest ++ NRest1 = RN NR : domain LRemain DRest M' : mem Z NRest1 H1 : mem Z LN ============================ mem Z LN
< search. Subgoal 2: Variables: X V LN RN Z New L1 Rest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NL : names (L1::Rest) LN NR : names (L1::New) RN M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * ============================ mem Z LN
< NL: case NL. Subgoal 2: Variables: X V LN RN Z New L1 Rest NScope NRest IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X NR : names (L1::New) RN M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN ============================ mem Z LN
< NR: case NR. Subgoal 2: Variables: X V LN RN Z New L1 Rest NScope NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope NL1 : names Rest NRest NL2 : NScope ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN ============================ mem Z LN
< apply domain_unique to NL NR. Subgoal 2: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN ============================ mem Z LN
< Or: apply mem_append to M NR2. Subgoal 2: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN Or : mem Z NScope1 \/ mem Z NRest1 ============================ mem Z LN
< M': case Or. Subgoal 2.1: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NScope1 ============================ mem Z LN
< apply mem_append_left to M' NL2. Subgoal 2.1: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NScope1 H1 : mem Z LN ============================ mem Z LN
< search. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest1 ============================ mem Z LN
< case IsL. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ mem Z LN
< M'': apply IH to _ _ R1 NL1 NR1 M'. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest M'' : mem Z NRest ============================ mem Z LN
< apply mem_append_right to M'' NL2. Subgoal 2.2: Variables: X V LN RN Z New L1 Rest NRest NScope1 NRest1 IH : forall X V L R LN RN Z, is_list (is_list (is_pair is_string is_value)) L -> is_string X -> replaceScopes X V L R * -> names L LN -> names R RN -> mem Z RN -> mem Z LN IsX : is_string X M : mem Z RN R : no_lookup L1 X R1 : replaceScopes X V Rest New * NL : domain L1 NScope1 NL1 : names Rest NRest NL2 : NScope1 ++ NRest = LN NR : domain L1 NScope1 NR1 : names New NRest1 NR2 : NScope1 ++ NRest1 = RN M' : mem Z NRest1 H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest M'' : mem Z NRest H3 : mem Z LN ============================ mem Z LN
< search. Proof completed.
< Theorem replaceScopes_keep_scopes [Key, Item] : forall L (K : Key) (I : Item) R N, replaceScopes K I L R -> length L N -> length R N. ============================ forall L K I R N, replaceScopes K I L R -> length L N -> length R N
< induction on 1. IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N ============================ forall L K I R N, replaceScopes K I L R @ -> length L N -> length R N
< intros R L. Variables: L K I R N IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N R : replaceScopes K I L R @ L : length L N ============================ length R N
< R: case R. Subgoal 1: Variables: K I N I1 Rest LRemain L1 IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N L : length (L1::Rest) N R : mem (K, I1) L1 R1 : remove_all L1 K LRemain ============================ length (((K, I)::LRemain)::Rest) N
< case L. Subgoal 1: Variables: K I N I1 Rest LRemain L1 N' IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N R : mem (K, I1) L1 R1 : remove_all L1 K LRemain H1 : length Rest N' H2 : 1 + N' = N ============================ length (((K, I)::LRemain)::Rest) N
< search. Subgoal 2: Variables: K I N New L1 Rest IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N L : length (L1::Rest) N R : no_lookup L1 K R1 : replaceScopes K I Rest New * ============================ length (L1::New) N
< case L. Subgoal 2: Variables: K I N New L1 Rest N' IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N R : no_lookup L1 K R1 : replaceScopes K I Rest New * H1 : length Rest N' H2 : 1 + N' = N ============================ length (L1::New) N
< apply IH to R1 _. Subgoal 2: Variables: K I N New L1 Rest N' IH : forall L K I R N, replaceScopes K I L R * -> length L N -> length R N R : no_lookup L1 K R1 : replaceScopes K I Rest New * H1 : length Rest N' H2 : 1 + N' = N H3 : length New N' ============================ length (L1::New) N
< search. Proof completed.
< Theorem newNameScopes_replaceScopes : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB. ============================ forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB
< induction on 5. IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB ============================ forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B @ -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB
< intros IsA IsB IsX IsV NNS R. Variables: S Len A B X V RB IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V NNS : newNameScopes S Len A B @ R : replaceScopes X V B RB ============================ exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB
< NNS: case NNS. Subgoal 1: Variables: S Len A B X V RB N SNames BNames IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V R : replaceScopes X V B RB NNS : length B Len NNS1 : drop N A B NNS2 : take N A S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB
< R: case R (keep). Subgoal 1.1: Variables: S Len A X V N SNames BNames I Rest LRemain L IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain ============================ exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< R': apply replaceScopes_drop_not_mem to _ IsX R NNS1 _ NNS3 _ _. Subgoal 1.1: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ============================ exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< exists RA. Subgoal 1.1: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ============================ replaceScopes X V A RA /\ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< split. Subgoal 1.1.1: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ============================ replaceScopes X V A RA
< search. Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ============================ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< ScopesLen: apply take_length to NNS2. Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N ============================ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< D: apply append_drop to R' ScopesLen. Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) ============================ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< IsReplaced: apply replaceScopes_is to _ _ R. Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) ============================ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< NRepl: apply names_exists to IsReplaced. Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ newNameScopes S Len RA (((X, V)::LRemain)::Rest)
< unfold . Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ exists N SNames BNames, ((((length (((X, V)::LRemain)::Rest) Len /\ drop N RA (((X, V)::LRemain)::Rest)) /\ take N RA S) /\ names S SNames) /\ names (((X, V)::LRemain)::Rest) BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists N, SNames, N1. Subgoal 1.1.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ ((((length (((X, V)::LRemain)::Rest) Len /\ drop N RA (((X, V)::LRemain)::Rest)) /\ take N RA S) /\ names S SNames) /\ names (((X, V)::LRemain)::Rest) N1) /\ (forall X1, mem X1 SNames -> mem X1 N1 -> false)
< split. Subgoal 1.1.2.1: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ length (((X, V)::LRemain)::Rest) Len
< case NNS. Subgoal 1.1.2.1: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 N' IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 H1 : length Rest N' H2 : 1 + N' = Len ============================ length (((X, V)::LRemain)::Rest) Len
< search. Subgoal 1.1.2.2: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ drop N RA (((X, V)::LRemain)::Rest)
< search. Subgoal 1.1.2.3: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ take N RA S
< Len: apply take_length to NNS2. Subgoal 1.1.2.3: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 Len : length S N ============================ take N RA S
< apply append_take to R' Len. Subgoal 1.1.2.3: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 Len : length S N H1 : take N RA S ============================ take N RA S
< search. Subgoal 1.1.2.4: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ names S SNames
< search. Subgoal 1.1.2.5: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ names (((X, V)::LRemain)::Rest) N1
< search. Subgoal 1.1.2.6: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 ============================ forall X1, mem X1 SNames -> mem X1 N1 -> false
< intros MS MN. Subgoal 1.1.2.6: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 X1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 MS : mem X1 SNames MN : mem X1 N1 ============================ false
< MBN: apply replaceScopes_names_backward to _ IsX R NNS4 NRepl MN. Subgoal 1.1.2.6: Variables: S Len A X V N SNames BNames I Rest LRemain L RA N1 X1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (((X, V)::LRemain)::Rest) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : mem (X, I) L R2 : remove_all L X LRemain R' : S ++ ((X, V)::LRemain)::Rest = RA R'1 : replaceScopes X V A RA ScopesLen : length S N D : drop N RA (((X, V)::LRemain)::Rest) IsReplaced : is_list (is_list (is_pair is_string is_value)) (((X, V)::LRemain)::Rest) NRepl : names (((X, V)::LRemain)::Rest) N1 MS : mem X1 SNames MN : mem X1 N1 MBN : mem X1 BNames ============================ false
< apply NNS5 to MS MBN. Subgoal 1.2: Variables: S Len A X V N SNames BNames New L Rest IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New ============================ exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA (L::New)
< R': apply replaceScopes_drop_not_mem to _ IsX R NNS1 _ NNS3 _ _. Subgoal 1.2: Variables: S Len A X V N SNames BNames New L Rest RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA ============================ exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA (L::New)
< exists RA. Subgoal 1.2: Variables: S Len A X V N SNames BNames New L Rest RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA ============================ replaceScopes X V A RA /\ newNameScopes S Len RA (L::New)
< split. Subgoal 1.2.1: Variables: S Len A X V N SNames BNames New L Rest RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA ============================ replaceScopes X V A RA
< search. Subgoal 1.2.2: Variables: S Len A X V N SNames BNames New L Rest RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA ============================ newNameScopes S Len RA (L::New)
< IsLN: apply replaceScopes_is to _ _ R. Subgoal 1.2.2: Variables: S Len A X V N SNames BNames New L Rest RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) ============================ newNameScopes S Len RA (L::New)
< NamesLNew: apply names_exists to IsLN. Subgoal 1.2.2: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 ============================ newNameScopes S Len RA (L::New)
< Len: apply take_length to NNS2. Subgoal 1.2.2: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ newNameScopes S Len RA (L::New)
< unfold . Subgoal 1.2.2: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ exists N SNames BNames, ((((length (L::New) Len /\ drop N RA (L::New)) /\ take N RA S) /\ names S SNames) /\ names (L::New) BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists N, SNames, N1. Subgoal 1.2.2: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ ((((length (L::New) Len /\ drop N RA (L::New)) /\ take N RA S) /\ names S SNames) /\ names (L::New) N1) /\ (forall X, mem X SNames -> mem X N1 -> false)
< split. Subgoal 1.2.2.1: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ length (L::New) Len
< Len': case NNS. Subgoal 1.2.2.1: Variables: S Len A X V N SNames BNames New L Rest RA N1 N' IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N Len' : length Rest N' Len'1 : 1 + N' = Len ============================ length (L::New) Len
< apply replaceScopes_keep_scopes to R2 Len'. Subgoal 1.2.2.1: Variables: S Len A X V N SNames BNames New L Rest RA N1 N' IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N Len' : length Rest N' Len'1 : 1 + N' = Len H1 : length New N' ============================ length (L::New) Len
< search. Subgoal 1.2.2.2: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ drop N RA (L::New)
< apply append_drop to R' Len. Subgoal 1.2.2.2: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N H1 : drop N RA (L::New) ============================ drop N RA (L::New)
< search. Subgoal 1.2.2.3: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ take N RA S
< apply append_take to R' Len. Subgoal 1.2.2.3: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N H1 : take N RA S ============================ take N RA S
< search. Subgoal 1.2.2.4: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ names S SNames
< search. Subgoal 1.2.2.5: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ names (L::New) N1
< search. Subgoal 1.2.2.6: Variables: S Len A X V N SNames BNames New L Rest RA N1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N ============================ forall X, mem X SNames -> mem X N1 -> false
< intros MS MN. Subgoal 1.2.2.6: Variables: S Len A X V N SNames BNames New L Rest RA N1 X1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N MS : mem X1 SNames MN : mem X1 N1 ============================ false
< MBN: apply replaceScopes_names_backward to _ _ R NNS4 NamesLNew MN. Subgoal 1.2.2.6: Variables: S Len A X V N SNames BNames New L Rest RA N1 X1 IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V R : replaceScopes X V (L::Rest) (L::New) NNS : length (L::Rest) Len NNS1 : drop N A (L::Rest) NNS2 : take N A S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false R1 : no_lookup L X R2 : replaceScopes X V Rest New R' : S ++ L::New = RA R'1 : replaceScopes X V A RA IsLN : is_list (is_list (is_pair is_string is_value)) (L::New) NamesLNew : names (L::New) N1 Len : length S N MS : mem X1 SNames MN : mem X1 N1 MBN : mem X1 BNames ============================ false
< apply NNS5 to MS MBN. Subgoal 2: Variables: S Len X V RB BR S1 AR IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) (S1::AR) IsB : is_list (is_list (is_pair is_string is_value)) (S1::BR) IsX : is_string X IsV : is_value V R : replaceScopes X V (S1::BR) RB NNS : newNameScopes S Len AR BR * ============================ exists RA, replaceScopes X V (S1::AR) RA /\ newNameScopes S Len RA RB
< R: case R. Subgoal 2.1: Variables: S Len X V BR S1 AR I LRemain IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) (S1::AR) IsB : is_list (is_list (is_pair is_string is_value)) (S1::BR) IsX : is_string X IsV : is_value V NNS : newNameScopes S Len AR BR * R : mem (X, I) S1 R1 : remove_all S1 X LRemain ============================ exists RA, replaceScopes X V (S1::AR) RA /\ newNameScopes S Len RA (((X, V)::LRemain)::BR)
< search. Subgoal 2.2: Variables: S Len X V BR S1 AR New IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsA : is_list (is_list (is_pair is_string is_value)) (S1::AR) IsB : is_list (is_list (is_pair is_string is_value)) (S1::BR) IsX : is_string X IsV : is_value V NNS : newNameScopes S Len AR BR * R : no_lookup S1 X R1 : replaceScopes X V BR New ============================ exists RA, replaceScopes X V (S1::AR) RA /\ newNameScopes S Len RA (S1::New)
< case IsA. Subgoal 2.2: Variables: S Len X V BR S1 AR New IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsB : is_list (is_list (is_pair is_string is_value)) (S1::BR) IsX : is_string X IsV : is_value V NNS : newNameScopes S Len AR BR * R : no_lookup S1 X R1 : replaceScopes X V BR New H1 : is_list (is_pair is_string is_value) S1 H2 : is_list (is_list (is_pair is_string is_value)) AR ============================ exists RA, replaceScopes X V (S1::AR) RA /\ newNameScopes S Len RA (S1::New)
< case IsB. Subgoal 2.2: Variables: S Len X V BR S1 AR New IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsX : is_string X IsV : is_value V NNS : newNameScopes S Len AR BR * R : no_lookup S1 X R1 : replaceScopes X V BR New H1 : is_list (is_pair is_string is_value) S1 H2 : is_list (is_list (is_pair is_string is_value)) AR H3 : is_list (is_pair is_string is_value) S1 H4 : is_list (is_list (is_pair is_string is_value)) BR ============================ exists RA, replaceScopes X V (S1::AR) RA /\ newNameScopes S Len RA (S1::New)
< apply IH to _ _ IsX _ NNS R1. Subgoal 2.2: Variables: S Len X V BR S1 AR New RA IH : forall S Len A B X V RB, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> newNameScopes S Len A B * -> replaceScopes X V B RB -> exists RA, replaceScopes X V A RA /\ newNameScopes S Len RA RB IsX : is_string X IsV : is_value V NNS : newNameScopes S Len AR BR * R : no_lookup S1 X R1 : replaceScopes X V BR New H1 : is_list (is_pair is_string is_value) S1 H2 : is_list (is_list (is_pair is_string is_value)) AR H3 : is_list (is_pair is_string is_value) S1 H4 : is_list (is_list (is_pair is_string is_value)) BR H5 : replaceScopes X V AR RA H6 : newNameScopes S Len RA New ============================ exists RA, replaceScopes X V (S1::AR) RA /\ newNameScopes S Len RA (S1::New)
< search. Proof completed.
< Theorem newNameScopes_length [V] : forall S Len (A : list (list (pair (string) V))) (B : list (list (pair (string) V))) BLen, newNameScopes S Len A B -> length B BLen -> Len <= BLen. ============================ forall S Len A B BLen, newNameScopes S Len A B -> length B BLen -> Len <= BLen
< induction on 1. IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen ============================ forall S Len A B BLen, newNameScopes S Len A B @ -> length B BLen -> Len <= BLen
< intros NNS Len. Variables: S Len A B BLen IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen NNS : newNameScopes S Len A B @ Len : length B BLen ============================ Len <= BLen
< NNS: case NNS. Subgoal 1: Variables: S Len A B BLen N SNames BNames IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen Len : length B BLen NNS : length B Len NNS1 : drop N A B NNS2 : take N A S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ Len <= BLen
< apply length_unique to Len NNS. Subgoal 1: Variables: S Len A B N SNames BNames IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen Len : length B Len NNS : length B Len NNS1 : drop N A B NNS2 : take N A S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ Len <= Len
< apply length_is to Len. Subgoal 1: Variables: S Len A B N SNames BNames IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen Len : length B Len NNS : length B Len NNS1 : drop N A B NNS2 : take N A S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer Len ============================ Len <= Len
< backchain is_integer_lesseq. Subgoal 2: Variables: S Len BLen BR S1 AR IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen Len : length (S1::BR) BLen NNS : newNameScopes S Len AR BR * ============================ Len <= BLen
< Len: case Len. Subgoal 2: Variables: S Len BLen BR S1 AR N' IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen NNS : newNameScopes S Len AR BR * Len : length BR N' Len1 : 1 + N' = BLen ============================ Len <= BLen
< LEq: apply IH to NNS Len. Subgoal 2: Variables: S Len BLen BR S1 AR N' IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen NNS : newNameScopes S Len AR BR * Len : length BR N' Len1 : 1 + N' = BLen LEq : Len <= N' ============================ Len <= BLen
< apply length_is to Len. Subgoal 2: Variables: S Len BLen BR S1 AR N' IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen NNS : newNameScopes S Len AR BR * Len : length BR N' Len1 : 1 + N' = BLen LEq : Len <= N' H1 : is_integer N' ============================ Len <= BLen
< L: apply lt_plus_one to Len1 _. Subgoal 2: Variables: S Len BLen BR S1 AR N' IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen NNS : newNameScopes S Len AR BR * Len : length BR N' Len1 : 1 + N' = BLen LEq : Len <= N' H1 : is_integer N' L : N' < BLen ============================ Len <= BLen
< apply lesseq_less_integer_transitive to LEq L. Subgoal 2: Variables: S Len BLen BR S1 AR N' IH : forall S Len A B BLen, newNameScopes S Len A B * -> length B BLen -> Len <= BLen NNS : newNameScopes S Len AR BR * Len : length BR N' Len1 : 1 + N' = BLen LEq : Len <= N' H1 : is_integer N' L : N' < BLen H2 : Len < BLen ============================ Len <= BLen
< backchain less_integer_lesseq. Proof completed.
< Theorem newNameScopes_reflexive : forall EE, is_list (is_list (is_pair is_string is_value)) EE -> exists Len, length EE Len /\ newNameScopes [] Len EE EE. ============================ forall EE, is_list (is_list (is_pair is_string is_value)) EE -> exists Len, length EE Len /\ newNameScopes [] Len EE EE
< intros IsEE. Variables: EE IsEE : is_list (is_list (is_pair is_string is_value)) EE ============================ exists Len, length EE Len /\ newNameScopes [] Len EE EE
< Len: apply length_exists_list_pair_string_value to IsEE. Variables: EE N IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N ============================ exists Len, length EE Len /\ newNameScopes [] Len EE EE
< exists N. Variables: EE N IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N ============================ length EE N /\ newNameScopes [] N EE EE
< split. Subgoal 1: Variables: EE N IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N ============================ length EE N
< search. Subgoal 2: Variables: EE N IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N ============================ newNameScopes [] N EE EE
< Names: apply names_exists to IsEE. Subgoal 2: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ newNameScopes [] N EE EE
< unfold . Subgoal 2: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ exists N1 SNames BNames, ((((length EE N /\ drop N1 EE EE) /\ take N1 EE []) /\ names [] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 0, [], N1. Subgoal 2: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ ((((length EE N /\ drop 0 EE EE) /\ take 0 EE []) /\ names [] []) /\ names EE N1) /\ (forall X, mem X [] -> mem X N1 -> false)
< split. Subgoal 2.1: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ length EE N
< search. Subgoal 2.2: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ drop 0 EE EE
< search. Subgoal 2.3: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ take 0 EE []
< search. Subgoal 2.4: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ names [] []
< search. Subgoal 2.5: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ names EE N1
< search. Subgoal 2.6: Variables: EE N N1 IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 ============================ forall X, mem X [] -> mem X N1 -> false
< intros M. Subgoal 2.6: Variables: EE N N1 X IsEE : is_list (is_list (is_pair is_string is_value)) EE Len : length EE N Names : names EE N1 M : mem X [] H1 : mem X N1 ============================ false
< case M. Proof completed.
< Theorem newNameScopes_same [V] : forall Len (B : list (list (pair (string) V))) (A : list (list (pair (string) V))), newNameScopes [] Len A B -> A = B. ============================ forall Len B A, newNameScopes [] Len A B -> A = B
< induction on 1. IH : forall Len B A, newNameScopes [] Len A B * -> A = B ============================ forall Len B A, newNameScopes [] Len A B @ -> A = B
< intros NNS. Variables: Len B A IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : newNameScopes [] Len A B @ ============================ A = B
< NNS: case NNS. Subgoal 1: Variables: Len B A N SNames BNames IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS1 : drop N A B NNS2 : take N A [] NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ A = B
< case NNS2. Subgoal 1: Variables: Len B A SNames BNames IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS1 : drop 0 A B NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ A = B
< Drop: case NNS1. Subgoal 1.1: Variables: Len B SNames BNames IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ B = B
< search. Subgoal 1.2: Variables: Len B SNames BNames N2 L X IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 L B ============================ X::L = B
< apply drop_is_integer to Drop1. Subgoal 1.2: Variables: Len B SNames BNames N2 L X IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 L B H1 : is_integer N2 ============================ X::L = B
< P: assert 1 + -1 = 0. Subgoal 1.2: Variables: Len B SNames BNames N2 L X IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 L B H1 : is_integer N2 P : 1 + -1 = 0 ============================ X::L = B
< apply plus_integer_unique_addend to _ _ _ Drop P. Subgoal 1.2: Variables: Len B SNames BNames L X IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 L B H1 : is_integer -1 P : 1 + -1 = 0 ============================ X::L = B
< GEq: apply drop_geq_0 to Drop1. Subgoal 1.2: Variables: Len B SNames BNames L X IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 L B H1 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ X::L = B
< LEq: case GEq. Subgoal 1.2: Variables: Len B SNames BNames L X IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 L B H1 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X::L = B
< case LEq. Subgoal 2: Variables: Len BR S AR IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : newNameScopes [] Len AR BR * ============================ S::AR = S::BR
< apply IH to NNS. Subgoal 2: Variables: Len BR S IH : forall Len B A, newNameScopes [] Len A B * -> A = B NNS : newNameScopes [] Len BR BR * ============================ S::BR = S::BR
< search. Proof completed.
< Extensible_Theorem evalExpr_newNameScopes : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalExpr FE EE_A E VA EE_A' O_A -> EvB : evalExpr FE EE_B E VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> VA = VB on EvA as IH_V_E, evalExpr_newNameScopes_output : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalExpr FE EE_A E VA EE_A' O_A -> EvB : evalExpr FE EE_B E VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> O_A = O_B on EvA as IH_O_E, evalExpr_newNameScopes_ctx : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalExpr FE EE_A E VA EE_A' O_A -> EvB : evalExpr FE EE_B E VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' on EvA as IH_C_E, evalStmt_newNameScopes_output : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> EvA : evalStmt FE (Scope::EE_A) S EE_A' O_A -> EvB : evalStmt FE (Scope::EE_B) S EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> O_A = O_B on EvA as IH_O_S, evalStmt_newNameScopes : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> EvA : evalStmt FE (Scope::EE_A) S EE_A' O_A -> EvB : evalStmt FE (Scope::EE_B) S EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' on EvA as IH_C_S, evalArgs_newNameScopes : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalArgs FE EE_A A VA EE_A' O_A -> EvB : evalArgs FE EE_B A VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> VA = VB on EvA as IH_V_A, evalArgs_newNameScopes_output : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalArgs FE EE_A A VA EE_A' O_A -> EvB : evalArgs FE EE_B A VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> O_A = O_B on EvA as IH_O_A, evalArgs_newNameScopes_ctx : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalArgs FE EE_A A VA EE_A' O_A -> EvB : evalArgs FE EE_B A VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' on EvA as IH_C_A, evalRecFields_newNameScopes : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalRecFields FE EE_A RF VA EE_A' O_A -> EvB : evalRecFields FE EE_B RF VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> VA = VB on EvA as IH_V_RF, evalRecFields_newNameScopes_output : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalRecFields FE EE_A RF VA EE_A' O_A -> EvB : evalRecFields FE EE_B RF VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> O_A = O_B on EvA as IH_O_RF, evalRecFields_newNameScopes_ctx : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvA : evalRecFields FE EE_A RF VA EE_A' O_A -> EvB : evalRecFields FE EE_B RF VB EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' on EvA as IH_C_RF. Subgoal 1.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len I IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ intVal I = VB
< case EvB. Subgoal 1.1: Variables: FE EE_A' EE_B' N Len I IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ intVal I = intVal I
< search. Subgoal 1.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A ============================ intVal I = VB
< case IsE. Subgoal 1.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< EvB: case EvB. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ intVal I = intVal I3
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 + I5 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply plus_integer_unique to EvA3 EvB2. Subgoal 1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I3) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 + I5 = I3 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3
< search. Subgoal 1.3: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A ============================ intVal I = VB
< case IsE. Subgoal 1.3: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< EvB: case EvB. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ intVal I = intVal I3
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 - I5 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply minus_integer_unique to EvA3 EvB2. Subgoal 1.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I3) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 - I5 = I3 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3
< search. Subgoal 1.4: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A ============================ intVal I = VB
< case IsE. Subgoal 1.4: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< EvB: case EvB. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ intVal I = intVal I3
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 * I5 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply multiply_integer_unique to EvA3 EvB2. Subgoal 1.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I3) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 * I5 = I3 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3
< search. Subgoal 1.5: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A ============================ intVal I = VB
< case IsE. Subgoal 1.5: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< EvB: case EvB. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ intVal I = intVal I3
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 / I5 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply divide_integer_unique to EvA3 EvB2. Subgoal 1.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I3) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 / I5 = I3 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3
< search. Subgoal 1.6: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ trueVal = VB
< case EvB. Subgoal 1.6: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ trueVal = trueVal
< search. Subgoal 1.7: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ falseVal = VB
< case EvB. Subgoal 1.7: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ falseVal = falseVal
< search. Subgoal 1.8: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ trueVal = VB
< case IsE. Subgoal 1.8: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< EvB: case EvB. Subgoal 1.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ trueVal = trueVal
< search. Subgoal 1.8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ trueVal = falseVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.9: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * ============================ falseVal = VB
< case IsE. Subgoal 1.9: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< EvB: case EvB. Subgoal 1.9.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ falseVal = falseVal
< search. Subgoal 1.9.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ falseVal = falseVal
< search. Subgoal 1.10: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ falseVal = VB
< case IsE. Subgoal 1.10: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< EvB: case EvB. Subgoal 1.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ falseVal = trueVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ falseVal = falseVal
< search. Subgoal 1.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ falseVal = falseVal
< search. Subgoal 1.11: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * ============================ trueVal = VB
< case IsE. Subgoal 1.11: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< EvB: case EvB. Subgoal 1.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ trueVal = trueVal
< search. Subgoal 1.11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ trueVal = trueVal
< search. Subgoal 1.11.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.12: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ trueVal = VB
< case IsE. Subgoal 1.12: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< EvB: case EvB. Subgoal 1.12.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ trueVal = trueVal
< search. Subgoal 1.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ trueVal = trueVal
< search. Subgoal 1.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ trueVal = falseVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.13: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ falseVal = VB
< case IsE. Subgoal 1.13: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< EvB: case EvB. Subgoal 1.13.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ falseVal = trueVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ falseVal = falseVal
< search. Subgoal 1.14: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * ============================ trueVal = VB
< case IsE. Subgoal 1.14: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 ============================ trueVal = VB
< EvB: case EvB. Subgoal 1.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ trueVal = trueVal
< search. Subgoal 1.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.15: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * ============================ falseVal = VB
< case IsE. Subgoal 1.15: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 ============================ falseVal = VB
< EvB: case EvB. Subgoal 1.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ falseVal = falseVal
< search. Subgoal 1.16: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A ============================ trueVal = VB
< case IsE. Subgoal 1.16: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< EvB: case EvB. Subgoal 1.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B ============================ trueVal = trueVal
< search. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B ============================ trueVal = falseVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 > I4 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< L: apply greater_integer_flip_less to EvA3. Subgoal 1.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 > I4 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 L : I4 < I3 ============================ trueVal = falseVal
< apply less_lesseq_flip_false to L EvB2. Subgoal 1.17: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A ============================ falseVal = VB
< case IsE. Subgoal 1.17: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< EvB: case EvB. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B ============================ falseVal = trueVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 <= I4 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< L: apply greater_integer_flip_less to EvB2. Subgoal 1.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 <= I4 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 L : I4 < I3 ============================ falseVal = trueVal
< apply less_lesseq_flip_false to L EvA3. Subgoal 1.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B ============================ falseVal = falseVal
< search. Subgoal 1.18: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ trueVal = VB
< case IsE. Subgoal 1.18: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< EvB: case EvB. Subgoal 1.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ trueVal = trueVal
< search. Subgoal 1.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B ============================ trueVal = falseVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V2 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V2 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V2 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply EvB2 to _. Subgoal 1.19: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A ============================ falseVal = VB
< case IsE. Subgoal 1.19: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< EvB: case EvB. Subgoal 1.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ falseVal = trueVal
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : V = V -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply EvA3 to _. Subgoal 1.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B ============================ falseVal = falseVal
< search. Subgoal 1.20: Variables: FE EE_B VB EE_A' EE_B' O_B N Len S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ stringVal S = VB
< case EvB. Subgoal 1.20: Variables: FE EE_A' EE_B' N Len S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ stringVal S = stringVal S
< search. Subgoal 1.21: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A ============================ stringVal S = VB
< case IsE. Subgoal 1.21: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ stringVal S = VB
< EvB: case EvB. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B ============================ stringVal S = stringVal S3
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ stringVal S = stringVal S3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ stringVal S = stringVal S3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S = stringVal S3
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S4 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S = stringVal S3
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O2 * EvA3 : S4 ++ S5 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S = stringVal S3
< apply append_unique to EvA3 EvB2. Subgoal 1.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S3) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O2 * EvA3 : S4 ++ S5 = S3 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S3 = stringVal S3
< search. Subgoal 1.22: Variables: FE EE_B VA VB EE_A' EE_B' O_B N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' VA ============================ VA = VB
< case IsE. Subgoal 1.22: Variables: FE EE_B VA VB EE_A' EE_B' O_B N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' VA H1 : is_string X ============================ VA = VB
< EvB: case EvB. Subgoal 1.22: Variables: FE VA VB EE_A' EE_B' N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' EvA1 : lookupScopes X EE_A' VA H1 : is_string X EvB : lookupScopes X EE_B' VB ============================ VA = VB
< LA: apply newNameScopes_lookupScopes to _ _ NNS EvB. Subgoal 1.22: Variables: FE VA VB EE_A' EE_B' N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' EvA1 : lookupScopes X EE_A' VA H1 : is_string X EvB : lookupScopes X EE_B' VB LA : lookupScopes X EE_A' VB ============================ VA = VB
< apply lookupScopes_unique to EvA1 LA. Subgoal 1.22: Variables: FE VB EE_A' EE_B' N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (name X) VB EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' EvA1 : lookupScopes X EE_A' VB H1 : is_string X EvB : lookupScopes X EE_B' VB LA : lookupScopes X EE_A' VB ============================ VB = VB
< search. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA ============================ VA = VB
< case IsE. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ VA = VB
< EvB: case EvB. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ VA = VB
< apply lookup_unique to EvA1 EvB. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames1 ArgVals InitEnv EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ VA = VB
< apply IH_V_A to _ _ _ _ EvA2 EvB1 _. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ VA = VB
< apply zip_unique to EvA3 EvB2. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ VA = VB
< apply evalArgs_isValue to _ _ _ EvA2. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 ============================ VA = VB
< IsFP: apply lookup_is_value_funCtx to _ EvA1. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar1, (RVVal1, (ArgNames1, Body1))) ============================ VA = VB
< IsF: case IsFP. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal1, (ArgNames1, Body1)) ============================ VA = VB
< IsF: case IsF1. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_pair (is_list is_string) is_stmt (ArgNames1, Body1) ============================ VA = VB
< IsF: case IsF2. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 ============================ VA = VB
< IsIE: apply zip_is to _ _ EvA3. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 ============================ VA = VB
< NNS': apply newNameScopes_reflexive to _ with EE = []. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] ============================ VA = VB
< NNS'': apply IH_C_S to _ _ _ _ EvA4 EvB3 NNS'1. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] NNS'' : newNameScopes [] Len1 EE2 EE1 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvA4. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] NNS'' : newNameScopes [] Len1 EE2 EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvB3. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] NNS'' : newNameScopes [] Len1 EE2 EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< LA: apply newNameScopes_lookupScopes to _ _ NNS'' EvB5. Subgoal 1.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] NNS'' : newNameScopes [] Len1 EE2 EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 LA : lookupScopes RetVar1 EE2 VB ============================ VA = VB
< apply lookupScopes_unique to LA EvA6. Subgoal 1.23: Variables: FE EE_A EE_B VA EE_A' EE_B' O_A O_B N Len O1 EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O1 * EvA3 : zip ArgNames1 ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar1 EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VA H3 : is_list is_value ArgVals1 IsF : is_string RetVar1 IsF1 : is_value RVVal1 IsF2 : is_list is_string ArgNames1 IsF3 : is_stmt Body1 IsIE : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] NNS'' : newNameScopes [] Len1 EE2 EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 LA : lookupScopes RetVar1 EE2 VA ============================ VA = VA
< search. Subgoal 1.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ VA = VB
< case IsE. Subgoal 1.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 ============================ VA = VB
< EvB: case EvB. Subgoal 1.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ VA = VB
< apply IH_C_S to _ _ _ _ EvA1 EvB _. Subgoal 1.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 1.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 1.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.24: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VB (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VB = VB
< search. Subgoal 1.25: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len VF RF IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * ============================ recVal VF = VB
< case IsE. Subgoal 1.25: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len VF RF IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF ============================ recVal VF = VB
< EvB: case EvB. Subgoal 1.25: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len VF RF VF1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' O_B ============================ recVal VF = recVal VF1
< apply IH_V_RF to _ _ _ _ EvA1 EvB _. Subgoal 1.25: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len RF VF1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF1 EE_A' O_A * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' O_B ============================ recVal VF1 = recVal VF1
< search. Subgoal 1.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA ============================ VA = VB
< case IsE. Subgoal 1.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ VA = VB
< EvB: case EvB. Subgoal 1.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB ============================ VA = VB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.26: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 F VB H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB ============================ VB = VB
< search. Subgoal 2.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len I IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 2.1: Variables: FE EE_A' EE_B' N Len I IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 2.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.3: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.3: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.3: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.4: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.4: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.4: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.5: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.5: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.5: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.6: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 2.6: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 2.7: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 2.7: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 2.8: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.8: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.9: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * ============================ O_A = O_B
< case IsE. Subgoal 2.9: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.9.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_B * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.9.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.10: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.10: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.11: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * ============================ O_A = O_B
< case IsE. Subgoal 2.11: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_B * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.11.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.12: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.12: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.12.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.13: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.13: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.13.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.14: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * ============================ O_A = O_B
< case IsE. Subgoal 2.14: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_B * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_B * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.15: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * ============================ O_A = O_B
< case IsE. Subgoal 2.15: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_B * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_B * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.16: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.16: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.17: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.17: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len I1 EE1 I2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.18: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.18: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len V EE1 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB3. Subgoal 2.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len V EE1 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.19: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.19: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 V2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB2. Subgoal 2.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len V1 EE1 V2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 V2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len V1 EE1 V2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.20: Variables: FE EE_B VB EE_A' EE_B' O_B N Len S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 2.20: Variables: FE EE_A' EE_B' N Len S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 2.21: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.21: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 S2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O4 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.21: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len S1 EE1 S2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O4 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.22: Variables: FE EE_B VA VB EE_A' EE_B' O_B N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' VA ============================ [] = O_B
< case EvB. Subgoal 2.22: Variables: FE VA VB EE_A' EE_B' N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' EvA1 : lookupScopes X EE_A' VA H1 : lookupScopes X EE_B' VB ============================ [] = []
< search. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA ============================ O_A = O_B
< case IsE. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ O_A = O_B
< apply IH_O_A to _ _ _ _ EvA2 EvB1 _. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ O_A = O_B
< apply lookup_unique to EvB EvA1. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB ============================ O_A = O_B
< apply IH_V_A to _ _ _ _ EvA2 EvB1 _. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB ============================ O_A = O_B
< apply zip_unique to EvA3 EvB2. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB ============================ O_A = O_B
< IsFP: apply lookup_is_value_funCtx to _ EvA1. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ O_A = O_B
< IsF: case IsFP. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ O_A = O_B
< IsF: case IsF1. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ O_A = O_B
< IsF: case IsF2. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ O_A = O_B
< apply evalArgs_isValue to _ _ _ EvA2. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : is_list is_value ArgVals1 ============================ O_A = O_B
< apply zip_is to _ _ EvA3. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 ============================ O_A = O_B
< NNS': apply newNameScopes_reflexive to _ with EE = []. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA4 EvB3 NNS'1. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body EE2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4 * EvA5 : O3 ++ O4 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] ============================ O_A = O_B
< apply append_unique to EvA5 EvB4. Subgoal 2.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len RetVar RVVal ArgNames Body EE2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 Len1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4 * EvA5 : O3 ++ O4 = O_B EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar EE1 VB IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 NNS' : length [] Len1 NNS'1 : newNameScopes [] Len1 [] [] ============================ O_B = O_B
< search. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA1 EvB _. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_S to _ _ _ _ EvA1 EvB _. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 Scope E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len EE1 Scope E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = O_B H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.25: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len VF RF IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * ============================ O_A = O_B
< case IsE. Subgoal 2.25: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len VF RF IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.25: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len VF RF VF1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' O_B ============================ O_A = O_B
< apply IH_O_RF to _ _ _ _ EvA1 EvB _. Subgoal 2.25: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len VF RF VF1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_B * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' O_B ============================ O_B = O_B
< search. Subgoal 2.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA ============================ O_A = O_B
< case IsE. Subgoal 2.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_B * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB ============================ O_B = O_B
< search. Subgoal 3.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len I IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 3.1: Variables: FE EE_A' EE_B' N Len I IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.3: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.3: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.4: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.4: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.5: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.5: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.6: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 3.6: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.7: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 3.7: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.8: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.8: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.8.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.9: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.9: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.9.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.9.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.10: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.10: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.10.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.11: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.11: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.11.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E2 E1 EE1 O1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.12: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.12: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.12.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.13: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.13: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.13.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.14: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.14: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.15: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.15: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (not E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.16: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.16: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.16.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.17: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.17: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.17.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.17.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.18: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.18: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.18.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.18.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.19: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.19: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.19.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.19.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.20: Variables: FE EE_B VB EE_A' EE_B' O_B N Len S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 3.20: Variables: FE EE_A' EE_B' N Len S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.21: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.21: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.21: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.22: Variables: FE EE_B VA VB EE_A' EE_B' O_B N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' VA ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 3.22: Variables: FE VA VB EE_A' EE_B' N Len X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' EvA1 : lookupScopes X EE_A' VA H1 : lookupScopes X EE_B' VB ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_A to _ _ _ _ EvA2 EvB1 _. Subgoal 3.23: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = O_A EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = O_B EvB5 : lookupScopes RetVar1 EE1 VB H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS1: apply IH_C_S to _ _ _ _ EvA1 EvB _. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenB. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 ============================ newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenB+: assert length ([]::EE_B) N3. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2: apply evalStmt_keep_scopes to _ _ _ EvB LenB+. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE_B'+: apply evalExpr_keep_scopes to _ _ _ EvB1 LenEE2. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS' LenEE_B'+. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 LEq : Len <= N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE_B: case LenEE_B'+ (keep). Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 LEq : Len <= N3 LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenEE_B. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 LEq : Len <= N3 LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = N3 H5 : is_integer N' ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to LenEE_B1 _. Subgoal 3.24: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE_A') (Scope1::EE_B') LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 LEq : Len <= N3 LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = N3 H5 : is_integer N' L : N' < N3 ============================ newNameScopes N Len EE_A' EE_B'
< NNS': case NNS'. Subgoal 3.24.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N3 N' N2 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 LEq : Len <= N3 LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = N3 H5 : is_integer N' L : N' < N3 NNS' : length (Scope1::EE_B') Len NNS'1 : drop N2 (Scope::EE_A') (Scope1::EE_B') NNS'2 : take N2 (Scope::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope1::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to _ NNS' with N1 = N3. Subgoal 3.24.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N' N2 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = Len LenB+ : length ([]::EE_B) Len LenEE2 : length EE2 Len LenEE_B'+ : length (Scope1::EE_B') Len LEq : Len <= Len LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = Len H5 : is_integer N' L : N' < Len NNS' : length (Scope1::EE_B') Len NNS'1 : drop N2 (Scope::EE_A') (Scope1::EE_B') NNS'2 : take N2 (Scope::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope1::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LEq': apply newNameScopes_length to NNS LenB. Subgoal 3.24.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N' N2 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = Len LenB+ : length ([]::EE_B) Len LenEE2 : length EE2 Len LenEE_B'+ : length (Scope1::EE_B') Len LEq : Len <= Len LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = Len H5 : is_integer N' L : N' < Len NNS' : length (Scope1::EE_B') Len NNS'1 : drop N2 (Scope::EE_A') (Scope1::EE_B') NNS'2 : take N2 (Scope::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope1::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LEq' : Len <= N1 ============================ newNameScopes N Len EE_A' EE_B'
< apply plus_integer_unique_addend to _ _ _ LenEE_B1 P. Subgoal 3.24.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 N1 N2 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = Len LenB+ : length ([]::EE_B) Len LenEE2 : length EE2 Len LenEE_B'+ : length (Scope1::EE_B') Len LEq : Len <= Len LenEE_B : length EE_B' N1 LenEE_B1 : 1 + N1 = Len H5 : is_integer N1 L : N1 < Len NNS' : length (Scope1::EE_B') Len NNS'1 : drop N2 (Scope::EE_A') (Scope1::EE_B') NNS'2 : take N2 (Scope::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope1::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LEq' : Len <= N1 ============================ newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to L LEq'. Subgoal 3.24.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E1 S EE2 O3 Scope1 O4 N1 N3 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS1 : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length EE_B N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenB+ : length ([]::EE_B) N3 LenEE2 : length EE2 N3 LenEE_B'+ : length (Scope1::EE_B') N3 LEq : Len <= N3 LenEE_B : length EE_B' N' LenEE_B1 : 1 + N' = N3 H5 : is_integer N' L : N' < N3 NNS' : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.25: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len VF RF IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.25: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len VF RF IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.25: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len VF RF VF1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_RF to _ _ _ _ EvA1 EvB _. Subgoal 3.25: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len VF RF VF1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O_A * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.26: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields F Rec Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O_A * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 F VB H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 4.1: Variables: FE EE_A EE_B EE_B' O_B N Len Scope IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) noop (Scope::EE_A) [] @ EvB : evalStmt FE (Scope::EE_B) noop EE_B' O_B NNS : newNameScopes N Len EE_A EE_B ============================ [] = O_B
< case EvB. Subgoal 4.1: Variables: FE EE_A EE_B N Len Scope IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) noop (Scope::EE_A) [] @ NNS : newNameScopes N Len EE_A EE_B ============================ [] = []
< search. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< NNS': apply IH_C_S to _ _ _ _ EvA1 EvB _. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA1 EvB _. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 ============================ O_A = O_B
< LenA: apply length_exists_list_pair_string_value to IsA. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 ============================ O_A = O_B
< IsN2: apply length_is to LenA. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 ============================ O_A = O_B
< IsN1: apply length_is to LenB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 ============================ O_A = O_B
< LenEE1: apply evalStmt_keep_scopes to _ _ _ EvA1 LenA. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 ============================ O_A = O_B
< LenEE2: apply evalStmt_keep_scopes to _ _ _ EvB LenB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 ============================ O_A = O_B
< LenB': case LenB (keep). Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 ============================ O_A = O_B
< LenA': case LenA (keep). Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 ============================ O_A = O_B
< GEqB: apply length_geq_0 to LenB'. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 ============================ O_A = O_B
< apply length_is to LenB'. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' ============================ O_A = O_B
< LB: apply lt_plus_one to LenB'1 _. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 ============================ O_A = O_B
< apply length_is to LenA'. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 ============================ O_A = O_B
< GEqA: apply length_geq_0 to LenA'. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 GEqA : N'1 >= 0 ============================ O_A = O_B
< LA: apply lt_plus_one to LenA'1 _. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 GEqA : N'1 >= 0 LA : N'1 < N2 ============================ O_A = O_B
< LEqA: case GEqA. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 ============================ O_A = O_B
< LEqB: case GEqB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' ============================ O_A = O_B
< LA': apply lesseq_less_integer_transitive to LEqA LA. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 ============================ O_A = O_B
< LB': apply lesseq_less_integer_transitive to LEqB LB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 ============================ O_A = O_B
< GA: apply less_integer_flip_greater to LA'. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 ============================ O_A = O_B
< GB: apply less_integer_flip_greater to LB'. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 ============================ O_A = O_B
< apply length_cons to LenEE1 GA. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 H T IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O3 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len (H::T) EE2 H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H::T) N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 ============================ O_A = O_B
< apply length_cons to LenEE2 GB. Subgoal 4.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 S2 S1 O3 O4 N1 N2 N' N'1 H T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O3 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len (H::T) (H1::T1) H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 ============================ O_A = O_B
< NNS': case NNS'. Subgoal 4.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 S2 S1 O3 O4 N1 N2 N' N'1 H T H1 T1 N3 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O3 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : length (H1::T1) Len NNS'1 : drop N3 (H::T) (H1::T1) NNS'2 : take N3 (H::T) N NNS'3 : names N SNames NNS'4 : names (H1::T1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ O_A = O_B
< apply length_unique to LenEE2 NNS'. Subgoal 4.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 S2 S1 O3 O4 N2 N' N'1 H T H1 T1 N3 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O3 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) Len LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer Len LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) Len LenB' : length EE_B N' LenB'1 : 1 + N' = Len LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < Len H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < Len GA : N2 > 0 GB : Len > 0 NNS' : length (H1::T1) Len NNS'1 : drop N3 (H::T) (H1::T1) NNS'2 : take N3 (H::T) N NNS'3 : names N SNames NNS'4 : names (H1::T1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ O_A = O_B
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 4.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 S2 S1 O3 O4 N2 N' N'1 H T H1 T1 N3 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O3 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) Len LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer Len LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) Len LenB' : length EE_B N' LenB'1 : 1 + N' = Len LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < Len H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < Len GA : N2 > 0 GB : Len > 0 NNS' : length (H1::T1) Len NNS'1 : drop N3 (H::T) (H1::T1) NNS'2 : take N3 (H::T) N NNS'3 : names N SNames NNS'4 : names (H1::T1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LEq : Len <= N' ============================ O_A = O_B
< apply less_lesseq_flip_false to LB LEq. Subgoal 4.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 S2 S1 O3 O4 N1 N2 N' N'1 T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H1::T) O3 * EvA2 : evalStmt FE (H1::T) S2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H1::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H1::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : newNameScopes N Len T T1 ============================ O_A = O_B
< apply IH_O_S to _ IsFE _ _ EvA2 EvB1 NNS'. Subgoal 4.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S2 S1 O3 O4 N1 N2 N' N'1 T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H1::T) O3 * EvA2 : evalStmt FE (H1::T) S2 EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H1::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H1::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : newNameScopes N Len T T1 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 4.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope S2 S1 O3 O4 N1 N2 N' N'1 T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H1::T) O3 * EvA2 : evalStmt FE (H1::T) S2 EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H1::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H1::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : newNameScopes N Len T T1 ============================ O_B = O_B
< search. Subgoal 4.3: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * ============================ O_A = O_B
< case IsS. Subgoal 4.3: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.3: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 V X E Ty EE2 Scope2 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.3: Variables: FE EE_A EE_B O_B N Len Scope EE1 Scope1 V X E Ty EE2 Scope2 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_B * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B ============================ O_B = O_B
< search. Subgoal 4.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assign X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' ============================ O_A = O_B
< case IsS. Subgoal 4.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assign X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.4: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_B * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' ============================ O_B = O_B
< search. Subgoal 4.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ O_A = O_B
< case IsS. Subgoal 4.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.5: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_B * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ O_B = O_B
< search. Subgoal 4.6: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.6: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Scope1 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 4.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope EE1 Scope1 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 4.6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.7: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.7: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.7.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Scope1 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 4.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope EE1 Scope1 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 4.8: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.8: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B ============================ O_A = O_B
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 4.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O_A = O_B
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _. Subgoal 4.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len (Scope1::EE2) (Scope2::EE4) ============================ O_A = O_B
< NNS'': case NNS''. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false ============================ O_A = O_B
< LenA: apply length_exists_list_pair_string_value to IsA. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 ============================ O_A = O_B
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 ============================ O_A = O_B
< IsN1: apply length_is to LenA. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 ============================ O_A = O_B
< IsN2: apply length_is to LenB. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 ============================ O_A = O_B
< LenEE1: apply evalExpr_keep_scopes to _ _ _ EvA1 LenA. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 ============================ O_A = O_B
< LenEE3: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 ============================ O_A = O_B
< PA: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 ============================ O_A = O_B
< PB: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 ============================ O_A = O_B
< LenEE1+: assert length ([]::EE1) N4. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 ============================ O_A = O_B
< LenEE3+: assert length ([]::EE3) N5. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) N5 ============================ O_A = O_B
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvA2 LenEE1+. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) N5 LenEE2+ : length (Scope1::EE2) N4 ============================ O_A = O_B
< LenEE4+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEE3+. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) N5 LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) N5 ============================ O_A = O_B
< apply length_unique to LenEE4+ NNS''. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = Len LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) Len LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) Len ============================ O_A = O_B
< LEq: apply newNameScopes_length to NNS' LenEE3. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = Len LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) Len LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) Len LEq : Len <= N3 ============================ O_A = O_B
< L: apply lt_plus_one to PB _. Subgoal 4.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = Len LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) Len LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) Len LEq : Len <= N3 L : N3 < Len ============================ O_A = O_B
< apply less_lesseq_flip_false to L LEq. Subgoal 4.8.1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len EE2 EE4 ============================ O_A = O_B
< NNS'': case NNS''. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false ============================ O_A = O_B
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ O_A = O_B
< IsN1: apply length_is to LenB. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 ============================ O_A = O_B
< LenEE3: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 ============================ O_A = O_B
< PB: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 ============================ O_A = O_B
< LenEE3+: assert length ([]::EE3) N3. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 ============================ O_A = O_B
< LenEE4+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEE3+. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4+ : length (Scope2::EE4) N3 ============================ O_A = O_B
< LenEE4: case LenEE4+. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 N' LenEE1 : 1 + N' = N3 ============================ O_A = O_B
< apply length_unique to LenEE4 NNS''. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 ============================ O_A = O_B
< apply length_is to LenEE4. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len ============================ O_A = O_B
< apply plus_integer_unique_addend to _ _ _ PB LenEE1. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) Len IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len ============================ O_A = O_B
< LenB': case LenB. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len ============================ O_A = O_B
< apply length_is to LenB'. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len H6 : is_integer N'1 ============================ O_A = O_B
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len H6 : is_integer N'1 LEq : Len <= N'1 ============================ O_A = O_B
< L: apply lt_plus_one to LenB'1 _. Subgoal 4.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len H6 : is_integer N'1 LEq : Len <= N'1 L : N'1 < Len ============================ O_A = O_B
< apply less_lesseq_flip_false to L LEq. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR ============================ O_A = O_B
< IsAR+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR IsAR+ : is_list (is_list (is_pair is_string is_value)) (Scope2::(S1::AR)) ============================ O_A = O_B
< case IsAR+. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) ============================ O_A = O_B
< IsBR+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) IsBR+ : is_list (is_list (is_pair is_string is_value)) (Scope2::(S1::BR)) ============================ O_A = O_B
< case IsBR+. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H7 : is_list (is_pair is_string is_value) Scope2 H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA3 EvB2 _. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O6 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H7 : is_list (is_pair is_string is_value) Scope2 H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O7 EvA5 : O7 ++ O6 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H7 : is_list (is_pair is_string is_value) Scope2 H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) ============================ O_A = O_B
< apply append_unique to EvA5 EvB4. Subgoal 4.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope EE1 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O5 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O7 EvA5 : O7 ++ O6 = O_B H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H7 : is_list (is_pair is_string is_value) Scope2 H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) ============================ O_B = O_B
< search. Subgoal 4.8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.9: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * ============================ O_A = O_B
< case IsS. Subgoal 4.9: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.9.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond EE1 O1 Scope1 EE2 O2 O3 O12 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O1 EvB1 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB3 : O1 ++ O2 = O12 EvB4 : O12 ++ O3 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_B * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 4.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * ============================ O_A = O_B
< case IsS. Subgoal 4.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA1 EvB _. Subgoal 4.10: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Scope1 S1 Scope2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_B * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B ============================ O_B = O_B
< search. Subgoal 4.11: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.11: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E I1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I1) EE_A' O1 * EvA2 : O1 ++ [intVal I1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope E I1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I1) EE_A' O2 * EvA2 : O2 ++ [intVal I1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = O_B ============================ O_A = O_B
< apply append_unique to EvA2 EvB1. Subgoal 4.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E I1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I1) EE_A' O2 * EvA2 : O2 ++ [intVal I1] = O_B H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = O_B ============================ O_B = O_B
< search. Subgoal 4.11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.11.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.11.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.12: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.12: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.12.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ O_A = O_B
< apply append_unique to EvA2 EvB1. Subgoal 4.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O_B H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ O_B = O_B
< search. Subgoal 4.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.12.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.13: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.13: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.13.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ O_A = O_B
< apply append_unique to EvA2 EvB1. Subgoal 4.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O_B H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ O_B = O_B
< search. Subgoal 4.13.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.14: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.14: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.14.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.14.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E S2 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.14.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S2 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S2) EE_A' O1 * EvA2 : O1 ++ [stringVal S2] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.14.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope E S2 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S2) EE_A' O2 * EvA2 : O2 ++ [stringVal S2] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = O_B ============================ O_A = O_B
< apply append_unique to EvA2 EvB1. Subgoal 4.14.4: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E S2 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S2) EE_A' O2 * EvA2 : O2 ++ [stringVal S2] = O_B H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = O_B ============================ O_B = O_B
< search. Subgoal 5.1: Variables: FE EE_A EE_B EE_B' O_B N Len Scope IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) noop (Scope::EE_A) [] @ EvB : evalStmt FE (Scope::EE_B) noop EE_B' O_B NNS : newNameScopes N Len EE_A EE_B ============================ newNameScopes N Len (Scope::EE_A) EE_B'
< case EvB. Subgoal 5.1: Variables: FE EE_A EE_B N Len Scope IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) noop (Scope::EE_A) [] @ NNS : newNameScopes N Len EE_A EE_B ============================ newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_S to _ _ _ _ EvA1 EvB _. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 ============================ newNameScopes N Len EE_A' EE_B'
< LenA: apply length_exists_list_pair_string_value to IsA. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN2: apply length_is to LenA. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE1: apply evalStmt_keep_scopes to _ _ _ EvA1 LenA. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2: apply evalStmt_keep_scopes to _ _ _ EvB LenB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 ============================ newNameScopes N Len EE_A' EE_B'
< LenB': case LenB (keep). Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 ============================ newNameScopes N Len EE_A' EE_B'
< LenA': case LenA (keep). Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 ============================ newNameScopes N Len EE_A' EE_B'
< GEqB: apply length_geq_0 to LenB'. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' ============================ newNameScopes N Len EE_A' EE_B'
< LB: apply lt_plus_one to LenB'1 _. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenA'. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 ============================ newNameScopes N Len EE_A' EE_B'
< GEqA: apply length_geq_0 to LenA'. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 GEqA : N'1 >= 0 ============================ newNameScopes N Len EE_A' EE_B'
< LA: apply lt_plus_one to LenA'1 _. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 GEqA : N'1 >= 0 LA : N'1 < N2 ============================ newNameScopes N Len EE_A' EE_B'
< LEqA: case GEqA. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 GEqB : N' >= 0 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 ============================ newNameScopes N Len EE_A' EE_B'
< LEqB: case GEqB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' ============================ newNameScopes N Len EE_A' EE_B'
< LA': apply lesseq_less_integer_transitive to LEqA LA. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 ============================ newNameScopes N Len EE_A' EE_B'
< LB': apply lesseq_less_integer_transitive to LEqB LB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 ============================ newNameScopes N Len EE_A' EE_B'
< GA: apply less_integer_flip_greater to LA'. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 ============================ newNameScopes N Len EE_A' EE_B'
< GB: apply less_integer_flip_greater to LB'. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length EE1 N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_cons to LenEE1 GA. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 EE2 O3 O4 N1 N2 N' N'1 H T IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O1 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len (H::T) EE2 H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) EE2 LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H::T) N2 LenEE2 : length EE2 N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_cons to LenEE2 GB. Subgoal 5.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 O3 O4 N1 N2 N' N'1 H T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O1 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len (H::T) (H1::T1) H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 ============================ newNameScopes N Len EE_A' EE_B'
< NNS': case NNS'. Subgoal 5.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 O3 O4 N1 N2 N' N'1 H T H1 T1 N3 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O1 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : length (H1::T1) Len NNS'1 : drop N3 (H::T) (H1::T1) NNS'2 : take N3 (H::T) N NNS'3 : names N SNames NNS'4 : names (H1::T1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenEE2 NNS'. Subgoal 5.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 O3 O4 N2 N' N'1 H T H1 T1 N3 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O1 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) Len LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer Len LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) Len LenB' : length EE_B N' LenB'1 : 1 + N' = Len LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < Len H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < Len GA : N2 > 0 GB : Len > 0 NNS' : length (H1::T1) Len NNS'1 : drop N3 (H::T) (H1::T1) NNS'2 : take N3 (H::T) N NNS'3 : names N SNames NNS'4 : names (H1::T1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 O3 O4 N2 N' N'1 H T H1 T1 N3 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H::T) O1 * EvA2 : evalStmt FE (H::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) Len LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer Len LenEE1 : length (H::T) N2 LenEE2 : length (H1::T1) Len LenB' : length EE_B N' LenB'1 : 1 + N' = Len LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < Len H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < Len GA : N2 > 0 GB : Len > 0 NNS' : length (H1::T1) Len NNS'1 : drop N3 (H::T) (H1::T1) NNS'2 : take N3 (H::T) N NNS'3 : names N SNames NNS'4 : names (H1::T1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LEq : Len <= N' ============================ newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to LB LEq. Subgoal 5.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 O3 O4 N1 N2 N' N'1 T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H1::T) O1 * EvA2 : evalStmt FE (H1::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H1::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H1::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : newNameScopes N Len T T1 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_S to _ IsFE _ _ EvA2 EvB1 NNS'. Subgoal 5.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 S2 S1 O3 O4 N1 N2 N' N'1 T H1 T1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (H1::T) O1 * EvA2 : evalStmt FE (H1::T) S2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE (Scope::EE_B) S1 (H1::T1) O3 EvB1 : evalStmt FE (H1::T1) S2 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : is_list (is_list (is_pair is_string is_value)) (H1::T) H4 : is_list (is_list (is_pair is_string is_value)) (H1::T1) LenB : length (Scope::EE_B) N1 LenA : length (Scope::EE_A) N2 IsN2 : is_integer N2 IsN1 : is_integer N1 LenEE1 : length (H1::T) N2 LenEE2 : length (H1::T1) N1 LenB' : length EE_B N' LenB'1 : 1 + N' = N1 LenA' : length EE_A N'1 LenA'1 : 1 + N'1 = N2 H5 : is_integer N' LB : N' < N1 H6 : is_integer N'1 LA : N'1 < N2 LEqA : 0 <= N'1 LEqB : 0 <= N' LA' : 0 < N2 LB' : 0 < N1 GA : N2 > 0 GB : N1 > 0 NNS' : newNameScopes N Len T T1 H7 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.3: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) EE_B'
< case IsS. Subgoal 5.3: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) EE_B'
< EvB: case EvB. Subgoal 5.3: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 V X E Ty EE2 Scope2 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.3: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 V X E Ty EE2 Scope2 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.3: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< NNS': case NNS' (keep). Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenB': case LenB (keep). Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenEE2+: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenEE2: case LenEE2+ (keep). Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply length_is to LenB'. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 H4 : is_integer N' ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply length_is to LenEE2. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 H4 : is_integer N' H5 : is_integer N'1 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply length_unique to NNS'1 LenEE2+. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N N2 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N N2 (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) N2 NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N2 <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 H4 : is_integer N' H5 : is_integer N'1 ============================ newNameScopes N N2 (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply plus_integer_unique_addend to _ _ _ LenEE1 LenB'1. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N N2 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N N2 (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) N2 NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N2 <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N' LenEE1 : 1 + N' = N2 H4 : is_integer N' H5 : is_integer N' ============================ newNameScopes N N2 (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< L: apply lt_plus_one to LenEE1 _. Subgoal 5.3.1: Variables: FE EE_A EE_B O_A O_B N Scope EE1 Scope1 X E Ty EE2 Scope2 V1 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N N2 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N N2 (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) N2 NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N2 <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N' LenEE1 : 1 + N' = N2 H4 : is_integer N' H5 : is_integer N' L : N' < N2 ============================ newNameScopes N N2 (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply less_lesseq_flip_false to L LEq. Subgoal 5.3.2: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 X E Ty EE2 Scope2 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V1)::Scope2)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope2::EE1) O_A * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope2::EE1) (Scope2::EE2) NNS'1 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len (((X, V1)::Scope2)::EE1) (((X, V1)::Scope2)::EE2)
< search. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assign X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assign X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 H3 : is_value V ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 H3 : is_value V H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 H3 : is_value V H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 H3 : is_value V1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< R: apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB1. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 E X V1 EE2 RA IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 H3 : is_value V1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 R : replaceScopes X V1 EE1 RA R1 : newNameScopes N Len RA EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< apply replaceScopes_unique to R EvA2. Subgoal 5.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 E X V1 EE2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : replaceScopes X V1 EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 H3 : is_value V1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 R : replaceScopes X V1 EE1 EE_A' R1 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ newNameScopes N Len EE_A' EE_B'
< Lkp: apply newNameScopes_lookupScopes to _ _ NNS'' EvB1. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals1) ============================ newNameScopes N Len EE_A' EE_B'
< apply lookupScopes_unique to Lkp EvA2. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals NewVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) ============================ newNameScopes N Len EE_A' EE_B'
< apply updateRecFields_unique to EvA3 EvB2. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) ============================ newNameScopes N Len EE_A' EE_B'
< IsV: apply evalExpr_isValue to _ _ _ EvA1. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 ============================ newNameScopes N Len EE_A' EE_B'
< IsR: apply lookupScopes_is to _ EvA2. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR : is_value (recVal FieldVals) IsR1 : is_string Rec ============================ newNameScopes N Len EE_A' EE_B'
< case IsR. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals ============================ newNameScopes N Len EE_A' EE_B'
< apply updateRecFields_is to _ _ _ EvB2. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< R: apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB3. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 RA IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 R : replaceScopes Rec (recVal NewVals1) EE1 RA R1 : newNameScopes N Len RA EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< apply replaceScopes_unique to R EvA4. Subgoal 5.5: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 FieldVals E Fields Rec V1 EE2 NewVals1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 EE1 O_A * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 EE2 O_B EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB2 : updateRecFields Fields V1 FieldVals NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' NNS' : newNameScopes N Len EE1 EE2 NNS'' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) Lkp : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsV : is_value V1 IsR1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 R : replaceScopes Rec (recVal NewVals1) EE1 EE_A' R1 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.6: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.6: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _. Subgoal 5.6.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : newNameScopes N Len (Scope1::EE_A') (Scope2::EE_B') ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenB': case LenB (keep). Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenEE2. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2+: assert length ([]::EE2) N3. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE_B'+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEE2+. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to P _. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' ============================ newNameScopes N Len EE_A' EE_B'
< L': apply lt_plus_one to LenB'1 _. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' L' : N' < N2 ============================ newNameScopes N Len EE_A' EE_B'
< L'': apply less_integer_transitive to L' L. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' L' : N' < N2 L'' : N' < N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to NNS'' LenEE_B'+. Subgoal 5.6.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N N3 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N N3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') N3 NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N3 <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' L' : N' < N2 L'' : N' < N3 ============================ newNameScopes N N3 EE_A' EE_B'
< apply less_lesseq_flip_false to L'' LEq. Subgoal 5.6.1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope2::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.7: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.7: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.7.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _. Subgoal 5.7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : newNameScopes N Len (Scope1::EE_A') (Scope2::EE_B') ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenB': case LenB (keep). Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenEE2. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2+: assert length ([]::EE2) N3. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE_B'+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEE2+. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to P _. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' ============================ newNameScopes N Len EE_A' EE_B'
< L': apply lt_plus_one to LenB'1 _. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' L' : N' < N2 ============================ newNameScopes N Len EE_A' EE_B'
< L'': apply less_integer_transitive to L' L. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') Len NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' L' : N' < N2 L'' : N' < N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to NNS'' LenEE_B'+. Subgoal 5.7.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Scope EE1 O1 Scope1 O2 El Th Cond EE2 O3 Scope2 O4 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N N3 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N N3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : length (Scope2::EE_B') N3 NNS''1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS''2 : take N1 (Scope1::EE_A') N NNS''3 : names N SNames NNS''4 : names (Scope2::EE_B') BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N3 <= N' LenEE2 : length EE2 N2 IsN1 : is_integer N2 P : 1 + N2 = N3 LenEE2+ : length ([]::EE2) N3 LenEE_B'+ : length (Scope2::EE_B') N3 L : N2 < N3 H6 : is_integer N' L' : N' < N2 L'' : N' < N3 ============================ newNameScopes N N3 EE_A' EE_B'
< apply less_lesseq_flip_false to L'' LEq. Subgoal 5.7.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 El Th Cond EE2 O3 Scope2 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope2::EE_A') O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope2::EE_B') O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.8: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.8: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _. Subgoal 5.8.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len (Scope1::EE2) (Scope2::EE4) ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LenA: apply length_exists_list_pair_string_value to IsA. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenA. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN2: apply length_is to LenB. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE1: apply evalExpr_keep_scopes to _ _ _ EvA1 LenA. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE3: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 ============================ newNameScopes N Len EE_A' EE_B'
< PA: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 ============================ newNameScopes N Len EE_A' EE_B'
< PB: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE1+: assert length ([]::EE1) N4. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE3+: assert length ([]::EE3) N5. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) N5 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvA2 LenEE1+. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) N5 LenEE2+ : length (Scope1::EE2) N4 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE4+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEE3+. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = N5 LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) N5 LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) N5 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenEE4+ NNS''. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = Len LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) Len LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) Len ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS' LenEE3. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = Len LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) Len LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) Len LEq : Len <= N3 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to PB _. Subgoal 5.8.1.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length (Scope2::EE4) Len NNS''1 : drop N1 (Scope1::EE2) (Scope2::EE4) NNS''2 : take N1 (Scope1::EE2) N NNS''3 : names N SNames NNS''4 : names (Scope2::EE4) BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenA : length (Scope::EE_A) N2 LenB : length (Scope::EE_B) N3 IsN1 : is_integer N2 IsN2 : is_integer N3 LenEE1 : length EE1 N2 LenEE3 : length EE3 N3 PA : 1 + N2 = N4 PB : 1 + N3 = Len LenEE1+ : length ([]::EE1) N4 LenEE3+ : length ([]::EE3) Len LenEE2+ : length (Scope1::EE2) N4 LenEE4+ : length (Scope2::EE4) Len LEq : Len <= N3 L : N3 < Len ============================ newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to L LEq. Subgoal 5.8.1.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len EE2 EE4 ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenB. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE3: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 ============================ newNameScopes N Len EE_A' EE_B'
< PB: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE3+: assert length ([]::EE3) N3. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE4+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEE3+. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4+ : length (Scope2::EE4) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE4: case LenEE4+. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 N' LenEE1 : 1 + N' = N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenEE4 NNS''. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenEE4. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 IsN1 : is_integer N2 LenEE3 : length EE3 N2 PB : 1 + N2 = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len ============================ newNameScopes N Len EE_A' EE_B'
< apply plus_integer_unique_addend to _ _ _ PB LenEE1. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) Len IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len ============================ newNameScopes N Len EE_A' EE_B'
< LenB': case LenB. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len H6 : is_integer N'1 ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len H6 : is_integer N'1 LEq : Len <= N'1 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to LenB'1 _. Subgoal 5.8.1.2.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 N1 SNames BNames N3 N'1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : length EE4 Len NNS''1 : drop N1 EE2 EE4 NNS''2 : take N1 EE2 N NNS''3 : names N SNames NNS''4 : names EE4 BNames NNS''5 : forall X, mem X SNames -> mem X BNames -> false IsN1 : is_integer Len LenEE3 : length EE3 Len PB : 1 + Len = N3 LenEE3+ : length ([]::EE3) N3 LenEE4 : length EE4 Len LenEE1 : 1 + Len = N3 H5 : is_integer Len LenB' : length EE_B N'1 LenB'1 : 1 + N'1 = Len H6 : is_integer N'1 LEq : Len <= N'1 L : N'1 < Len ============================ newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to L LEq. Subgoal 5.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR ============================ newNameScopes N Len EE_A' EE_B'
< IsAR+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 5.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR IsAR+ : is_list (is_list (is_pair is_string is_value)) (Scope2::(S1::AR)) ============================ newNameScopes N Len EE_A' EE_B'
< case IsAR+. Subgoal 5.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) ============================ newNameScopes N Len EE_A' EE_B'
< IsBR+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 5.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) IsBR+ : is_list (is_list (is_pair is_string is_value)) (Scope2::(S1::BR)) ============================ newNameScopes N Len EE_A' EE_B'
< case IsBR+. Subgoal 5.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H7 : is_list (is_pair is_string is_value) Scope2 H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_S to _ _ _ _ EvA3 EvB2 _. Subgoal 5.8.1.2.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BR S1 AR IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope2::(S1::AR)) O2 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(S1::BR)) O5 EvB2 : evalStmt FE (S1::BR) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = O_B NNS' : newNameScopes N Len EE1 EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NNS'' : newNameScopes N Len AR BR H5 : is_list (is_pair is_string is_value) Scope2 H6 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H7 : is_list (is_pair is_string is_value) Scope2 H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H9 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Scope1 EE2 O2 O3 O12 Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = O_A H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.9: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.9: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.9.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond EE1 O1 Scope1 EE2 O2 O3 O12 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O1 EvB1 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB3 : O1 ++ O2 = O12 EvB4 : O12 ++ O3 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O_A * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O_B H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_S to _ _ _ _ EvA1 EvB _. Subgoal 5.10: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : newNameScopes N Len (Scope1::EE_A') (Scope2::EE_B') ============================ newNameScopes N Len EE_A' EE_B'
< NNS': case NNS'. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ newNameScopes N Len EE_A' EE_B'
< LenB': case LenB (keep). Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenB. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' ============================ newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = N3 ============================ newNameScopes N Len EE_A' EE_B'
< Len++: assert length ([]::(Scope::EE_B)) N3. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = N3 Len++ : length ([]::(Scope::EE_B)) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenFinal: apply evalStmt_keep_scopes to _ _ _ EvB Len++. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = N3 Len++ : length ([]::(Scope::EE_B)) N3 LenFinal : length (Scope2::EE_B') N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenFinal NNS'. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = Len Len++ : length ([]::(Scope::EE_B)) Len LenFinal : length (Scope2::EE_B') Len ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to P _. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = Len Len++ : length ([]::(Scope::EE_B)) Len LenFinal : length (Scope2::EE_B') Len L : N2 < Len ============================ newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = Len Len++ : length ([]::(Scope::EE_B)) Len LenFinal : length (Scope2::EE_B') Len L : N2 < Len H2 : is_integer N' ============================ newNameScopes N Len EE_A' EE_B'
< L': apply lt_plus_one to LenB'1 _. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = Len Len++ : length ([]::(Scope::EE_B)) Len LenFinal : length (Scope2::EE_B') Len L : N2 < Len H2 : is_integer N' L' : N' < N2 ============================ newNameScopes N Len EE_A' EE_B'
< L'': apply less_integer_transitive to L' L. Subgoal 5.10.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2 N1 SNames BNames N2 N' IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : length (Scope2::EE_B') Len NNS'1 : drop N1 (Scope1::EE_A') (Scope2::EE_B') NNS'2 : take N1 (Scope1::EE_A') N NNS'3 : names N SNames NNS'4 : names (Scope2::EE_B') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 IsN1 : is_integer N2 LEq : Len <= N' P : 1 + N2 = Len Len++ : length ([]::(Scope::EE_B)) Len LenFinal : length (Scope2::EE_B') Len L : N2 < Len H2 : is_integer N' L' : N' < N2 L'' : N' < Len ============================ newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to L'' LEq. Subgoal 5.10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 Scope2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope2::EE_A') O_A * H1 : is_stmt S1 EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (Scope2::EE_B') O_B NNS' : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.11: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.11: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E I1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.11.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E I1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.11.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.11.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.11.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.11.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope I O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.12: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.12: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.12.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.12.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.12.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.12.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.12.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.12.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.13: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.13: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.13.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.13.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.13.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.13.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.13.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.13.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 E S1 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.14: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.14: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (printVal E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.14.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E I O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.14.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.14.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.14.3: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.14.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E S2 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.14.4: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 O1 E S2 O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = O_A H1 : is_expr E EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = O_B H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 6.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = VB
< case EvB. Subgoal 6.1: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 6.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ V::VRest = VB
< case IsA. Subgoal 6.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest ============================ V::VRest = VB
< EvB: case EvB. Subgoal 6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ V::VRest = V1::VRest1
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ V1::VRest = V1::VRest1
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ V1::VRest = V1::VRest1
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ V1::VRest = V1::VRest1
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ V1::VRest = V1::VRest1
< apply IH_V_A to _ _ _ _ EvA2 EvB1 _. Subgoal 6.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest1 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ V1::VRest1 = V1::VRest1
< search. Subgoal 7.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 7.1: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 7.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsA. Subgoal 7.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest ============================ O_A = O_B
< EvB: case EvB. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_A to _ _ _ _ EvA2 EvB1 _. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 7.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 8.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 8.1: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 8.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsA. Subgoal 8.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_A to _ _ _ _ EvA2 EvB1 _. Subgoal 8.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 9.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = VB
< case EvB. Subgoal 9.1: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 9.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ (F, V)::VRest = VB
< case IsRF. Subgoal 9.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ (F, V)::VRest = VB
< EvB: case EvB. Subgoal 9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ (F, V)::VRest = (F, V1)::VRest1
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ (F, V)::VRest = (F, V1)::VRest1
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ (F, V)::VRest = (F, V1)::VRest1
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V)::VRest = (F, V1)::VRest1
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V1)::VRest = (F, V1)::VRest1
< apply IH_V_RF to _ _ _ _ EvA2 EvB1 _. Subgoal 9.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest1 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V1)::VRest1 = (F, V1)::VRest1
< search. Subgoal 10.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 10.1: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 10.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsRF. Subgoal 10.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ O_A = O_B
< EvB: case EvB. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_RF to _ _ _ _ EvA2 EvB1 _. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 10.2: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 11.1: Variables: FE EE_B VB EE_A' EE_B' O_B N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case EvB. Subgoal 11.1: Variables: FE EE_A' EE_B' N Len IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 11.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsRF. Subgoal 11.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_RF to _ _ _ _ EvA2 EvB1 _. Subgoal 11.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Proof completed.
< Theorem evalExpr_unique : forall FE EE E VA EE_A OA VB EE_B OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E VA EE_A OA -> evalExpr FE EE E VB EE_B OB -> (VA = VB /\ EE_A = EE_B) /\ OA = OB. ============================ forall FE EE E VA EE_A OA VB EE_B OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E VA EE_A OA -> evalExpr FE EE E VB EE_B OB -> (VA = VB /\ EE_A = EE_B) /\ OA = OB
< intros IsE IsFE IsEE EvA EvB. Variables: FE EE E VA EE_A OA VB EE_B OB IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalExpr FE EE E VA EE_A OA EvB : evalExpr FE EE E VB EE_B OB ============================ (VA = VB /\ EE_A = EE_B) /\ OA = OB
< LN: apply newNameScopes_reflexive to IsEE. Variables: FE EE E VA EE_A OA VB EE_B OB Len IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalExpr FE EE E VA EE_A OA EvB : evalExpr FE EE E VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VA = VB /\ EE_A = EE_B) /\ OA = OB
< apply evalExpr_newNameScopes to _ _ _ _ EvA EvB _. Variables: FE EE E EE_A OA VB EE_B OB Len IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalExpr FE EE E VB EE_A OA EvB : evalExpr FE EE E VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VB = VB /\ EE_A = EE_B) /\ OA = OB
< apply evalExpr_newNameScopes_output to _ _ _ _ EvA EvB _. Variables: FE EE E EE_A VB EE_B OB Len IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalExpr FE EE E VB EE_A OB EvB : evalExpr FE EE E VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VB = VB /\ EE_A = EE_B) /\ OB = OB
< NNS: apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA EvB _. Variables: FE EE E EE_A VB EE_B OB Len IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalExpr FE EE E VB EE_A OB EvB : evalExpr FE EE E VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_A EE_B ============================ (VB = VB /\ EE_A = EE_B) /\ OB = OB
< apply newNameScopes_same to NNS. Variables: FE EE E VB EE_B OB Len IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalExpr FE EE E VB EE_B OB EvB : evalExpr FE EE E VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_B EE_B ============================ (VB = VB /\ EE_B = EE_B) /\ OB = OB
< search. Proof completed.
< Theorem evalStmt_unique : forall FE Scope EE S EE_A OA EE_B OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE_A OA -> evalStmt FE (Scope::EE) S EE_B OB -> EE_A = EE_B /\ OA = OB. ============================ forall FE Scope EE S EE_A OA EE_B OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE_A OA -> evalStmt FE (Scope::EE) S EE_B OB -> EE_A = EE_B /\ OA = OB
< intros IsS IsFE IsEE EvA EvB. Variables: FE Scope EE S EE_A OA EE_B OB IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) EvA : evalStmt FE (Scope::EE) S EE_A OA EvB : evalStmt FE (Scope::EE) S EE_B OB ============================ EE_A = EE_B /\ OA = OB
< IsEE': case IsEE. Variables: FE Scope EE S EE_A OA EE_B OB IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE EvA : evalStmt FE (Scope::EE) S EE_A OA EvB : evalStmt FE (Scope::EE) S EE_B OB IsEE' : is_list (is_pair is_string is_value) Scope IsEE'1 : is_list (is_list (is_pair is_string is_value)) EE ============================ EE_A = EE_B /\ OA = OB
< LN: apply newNameScopes_reflexive to IsEE'1. Variables: FE Scope EE S EE_A OA EE_B OB Len IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE EvA : evalStmt FE (Scope::EE) S EE_A OA EvB : evalStmt FE (Scope::EE) S EE_B OB IsEE' : is_list (is_pair is_string is_value) Scope IsEE'1 : is_list (is_list (is_pair is_string is_value)) EE LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ EE_A = EE_B /\ OA = OB
< apply evalStmt_newNameScopes_output to _ _ _ _ EvA EvB _. Variables: FE Scope EE S EE_A EE_B OB Len IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE EvA : evalStmt FE (Scope::EE) S EE_A OB EvB : evalStmt FE (Scope::EE) S EE_B OB IsEE' : is_list (is_pair is_string is_value) Scope IsEE'1 : is_list (is_list (is_pair is_string is_value)) EE LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ EE_A = EE_B /\ OB = OB
< NNS: apply evalStmt_newNameScopes to _ _ _ _ EvA EvB _. Variables: FE Scope EE S EE_A EE_B OB Len IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE EvA : evalStmt FE (Scope::EE) S EE_A OB EvB : evalStmt FE (Scope::EE) S EE_B OB IsEE' : is_list (is_pair is_string is_value) Scope IsEE'1 : is_list (is_list (is_pair is_string is_value)) EE LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_A EE_B ============================ EE_A = EE_B /\ OB = OB
< apply newNameScopes_same to NNS. Variables: FE Scope EE S EE_B OB Len IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE EvA : evalStmt FE (Scope::EE) S EE_B OB EvB : evalStmt FE (Scope::EE) S EE_B OB IsEE' : is_list (is_pair is_string is_value) Scope IsEE'1 : is_list (is_list (is_pair is_string is_value)) EE LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_B EE_B ============================ EE_B = EE_B /\ OB = OB
< search. Proof completed.
< Theorem evalArgs_unique : forall FE EE A VA EE_A OA VB EE_B OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A VA EE_A OA -> evalArgs FE EE A VB EE_B OB -> (VA = VB /\ EE_A = EE_B) /\ OA = OB. ============================ forall FE EE A VA EE_A OA VB EE_B OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A VA EE_A OA -> evalArgs FE EE A VB EE_B OB -> (VA = VB /\ EE_A = EE_B) /\ OA = OB
< intros IsE IsFE IsEE EvA EvB. Variables: FE EE A VA EE_A OA VB EE_B OB IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalArgs FE EE A VA EE_A OA EvB : evalArgs FE EE A VB EE_B OB ============================ (VA = VB /\ EE_A = EE_B) /\ OA = OB
< LN: apply newNameScopes_reflexive to IsEE. Variables: FE EE A VA EE_A OA VB EE_B OB Len IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalArgs FE EE A VA EE_A OA EvB : evalArgs FE EE A VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VA = VB /\ EE_A = EE_B) /\ OA = OB
< apply evalArgs_newNameScopes to _ _ _ _ EvA EvB _. Variables: FE EE A EE_A OA VB EE_B OB Len IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalArgs FE EE A VB EE_A OA EvB : evalArgs FE EE A VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VB = VB /\ EE_A = EE_B) /\ OA = OB
< apply evalArgs_newNameScopes_output to _ _ _ _ EvA EvB _. Variables: FE EE A EE_A VB EE_B OB Len IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalArgs FE EE A VB EE_A OB EvB : evalArgs FE EE A VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VB = VB /\ EE_A = EE_B) /\ OB = OB
< NNS: apply evalArgs_newNameScopes_ctx to _ _ _ _ EvA EvB _. Variables: FE EE A EE_A VB EE_B OB Len IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalArgs FE EE A VB EE_A OB EvB : evalArgs FE EE A VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_A EE_B ============================ (VB = VB /\ EE_A = EE_B) /\ OB = OB
< apply newNameScopes_same to NNS. Variables: FE EE A VB EE_B OB Len IsE : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalArgs FE EE A VB EE_B OB EvB : evalArgs FE EE A VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_B EE_B ============================ (VB = VB /\ EE_B = EE_B) /\ OB = OB
< search. Proof completed.
< Theorem evalRecFields_unique : forall FE EE RF VA EE_A OA VB EE_B OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF VA EE_A OA -> evalRecFields FE EE RF VB EE_B OB -> (VA = VB /\ EE_A = EE_B) /\ OA = OB. ============================ forall FE EE RF VA EE_A OA VB EE_B OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF VA EE_A OA -> evalRecFields FE EE RF VB EE_B OB -> (VA = VB /\ EE_A = EE_B) /\ OA = OB
< intros IsE IsFE IsEE EvA EvB. Variables: FE EE RF VA EE_A OA VB EE_B OB IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalRecFields FE EE RF VA EE_A OA EvB : evalRecFields FE EE RF VB EE_B OB ============================ (VA = VB /\ EE_A = EE_B) /\ OA = OB
< LN: apply newNameScopes_reflexive to IsEE. Variables: FE EE RF VA EE_A OA VB EE_B OB Len IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalRecFields FE EE RF VA EE_A OA EvB : evalRecFields FE EE RF VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VA = VB /\ EE_A = EE_B) /\ OA = OB
< apply evalRecFields_newNameScopes to _ _ _ _ EvA EvB _. Variables: FE EE RF EE_A OA VB EE_B OB Len IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalRecFields FE EE RF VB EE_A OA EvB : evalRecFields FE EE RF VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VB = VB /\ EE_A = EE_B) /\ OA = OB
< apply evalRecFields_newNameScopes_output to _ _ _ _ EvA EvB _. Variables: FE EE RF EE_A VB EE_B OB Len IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalRecFields FE EE RF VB EE_A OB EvB : evalRecFields FE EE RF VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE ============================ (VB = VB /\ EE_A = EE_B) /\ OB = OB
< NNS: apply evalRecFields_newNameScopes_ctx to _ _ _ _ EvA EvB _. Variables: FE EE RF EE_A VB EE_B OB Len IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalRecFields FE EE RF VB EE_A OB EvB : evalRecFields FE EE RF VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_A EE_B ============================ (VB = VB /\ EE_A = EE_B) /\ OB = OB
< apply newNameScopes_same to NNS. Variables: FE EE RF VB EE_B OB Len IsE : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE EvA : evalRecFields FE EE RF VB EE_B OB EvB : evalRecFields FE EE RF VB EE_B OB LN : length EE Len LN1 : newNameScopes [] Len EE EE NNS : newNameScopes [] Len EE_B EE_B ============================ (VB = VB /\ EE_B = EE_B) /\ OB = OB
< search. Proof completed.
< Ext_Size evalExpr FE EE E V EE' O, evalArgs FE EE E V EE' O, evalRecFields FE EE E F EE' O, evalStmt FE EE S EE' O. Proof completed.
< Proj_Rel evalExpr FE EE E V EE' O, evalArgs FE EE E V EE' O, evalRecFields FE EE E F EE' O, evalStmt FE EE S EE' O. Proof completed.
< Extensible_Theorem evalExpr_newNameScopes_exists_ES : forall FE EE_A EE_B E V EE_B' O N Len ES, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvB : <evalExpr {ES}> FE EE_B E V EE_B' O ES -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES on EvB as IH_E, evalStmt_newNameScopes_exists_ES : forall FE EE_A EE_B S EE_B' O N Len Scope ES, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> EvB : <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES on EvB as IH_S, evalArgs_newNameScopes_exists_ES : forall FE EE_A EE_B A V EE_B' O N Len ES, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvB : <evalArgs {ES}> FE EE_B A V EE_B' O ES -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES on EvB as IH_A, evalRecFields_newNameScopes_exists_ES : forall FE EE_A EE_B RF V EE_B' O N Len ES, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> EvB : <evalRecFields {ES}> FE EE_B RF V EE_B' O ES -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES on EvB as IH_RF. Subgoal 1.1: Variables: FE EE_A EE_B' N Len I IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' (num I) (intVal I) EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (num I) (intVal I) EE_A' [] 0
< search. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< case IsE. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (plus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 + I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (intVal I2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) EE_A' O ES
< search. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< case IsE. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.3: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (minus E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 - I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (intVal I2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) EE_A' O ES
< search. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< case IsE. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.4: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (mult E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 * I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (intVal I2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) EE_A' O ES
< search. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< case IsE. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.5: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 I E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (div E1 E2) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 / I2 = I EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (intVal I2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) EE_A' O ES
< search. Subgoal 1.6: Variables: FE EE_A EE_B' N Len IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' true trueVal EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalExpr {ES}> FE EE_A true trueVal EE_A' [] 0
< search. Subgoal 1.7: Variables: FE EE_A EE_B' N Len IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' false falseVal EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalExpr {ES}> FE EE_A false falseVal EE_A' [] 0
< search. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< case IsE. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.8: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 trueVal EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) trueVal EE_A' O ES
< search. Subgoal 1.9: Variables: FE EE_A EE_B EE_B' O N Len ES E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal EE_B' O ES * ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< case IsE. Subgoal 1.9: Variables: FE EE_A EE_B EE_B' O N Len ES E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal EE_B' O ES * H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS. Subgoal 1.9: Variables: FE EE_A EE_B EE_B' O N Len ES E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal EE_B' O ES * H1 : is_expr E1 H2 : is_expr E2 H3 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O ES ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< search. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< case IsE. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.10: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (and E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 trueVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 trueVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 falseVal EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (and E1 E2) falseVal EE_A' O ES
< search. Subgoal 1.11: Variables: FE EE_A EE_B EE_B' O N Len ES E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal EE_B' O ES * ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< case IsE. Subgoal 1.11: Variables: FE EE_A EE_B EE_B' O N Len ES E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal EE_B' O ES * H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS. Subgoal 1.11: Variables: FE EE_A EE_B EE_B' O N Len ES E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal EE_B' O ES * H1 : is_expr E1 H2 : is_expr E2 H3 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O ES ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< search. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< case IsE. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.12: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 trueVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 trueVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 trueVal EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) trueVal EE_A' O ES
< search. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< case IsE. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.13: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (or E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 falseVal EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 falseVal EE1 O2 EvB2' : evalExpr FE EE1 E2 falseVal EE_B' O3 EvA1' : evalExpr FE EE_A E1 falseVal EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 falseVal EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (or E1 E2) falseVal EE_A' O ES
< search. Subgoal 1.14: Variables: FE EE_A EE_B EE_B' O N Len ES E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (not E1) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal EE_B' O ES * ============================ exists EE_A', <evalExpr {ES}> FE EE_A (not E1) trueVal EE_A' O ES
< case IsE. Subgoal 1.14: Variables: FE EE_A EE_B EE_B' O N Len ES E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (not E1) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal EE_B' O ES * H1 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (not E1) trueVal EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS. Subgoal 1.14: Variables: FE EE_A EE_B EE_B' O N Len ES E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (not E1) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal EE_B' O ES * H1 : is_expr E1 H2 : <evalExpr {ES}> FE EE_A E1 falseVal EE_A' O ES ============================ exists EE_A', <evalExpr {ES}> FE EE_A (not E1) trueVal EE_A' O ES
< search. Subgoal 1.15: Variables: FE EE_A EE_B EE_B' O N Len ES E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (not E1) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal EE_B' O ES * ============================ exists EE_A', <evalExpr {ES}> FE EE_A (not E1) falseVal EE_A' O ES
< case IsE. Subgoal 1.15: Variables: FE EE_A EE_B EE_B' O N Len ES E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (not E1) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal EE_B' O ES * H1 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (not E1) falseVal EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS. Subgoal 1.15: Variables: FE EE_A EE_B EE_B' O N Len ES E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (not E1) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal EE_B' O ES * H1 : is_expr E1 H2 : <evalExpr {ES}> FE EE_A E1 trueVal EE_A' O ES ============================ exists EE_A', <evalExpr {ES}> FE EE_A (not E1) falseVal EE_A' O ES
< search. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< case IsE. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.16: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 > I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (intVal I2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) trueVal EE_A' O ES
< search. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< case IsE. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.17: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 I1 EE1 O2 I2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (greater E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (intVal I2) EE_B' O3 N3 * EvB4 : I1 <= I2 EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (intVal I1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (intVal I2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (intVal I1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (intVal I2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (greater E1 E2) falseVal EE_A' O ES
< search. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< case IsE. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V1 EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V1 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V1 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V1 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V1 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.18: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) trueVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V1 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V1 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 V1 EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) trueVal EE_A' O ES
< search. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< case IsE. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V2 EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V2 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V2 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V2 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V2 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.19: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 V1 EE1 O2 V2 O3 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (eq E1 E2) falseVal EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB4 : V1 = V2 -> false EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvB2' : evalExpr FE EE1 E2 V2 EE_B' O3 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 V2 EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (eq E1 E2) falseVal EE_A' O ES
< search. Subgoal 1.20: Variables: FE EE_A EE_B' N Len S IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' (stringLit S) (stringVal S) EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stringLit S) (stringVal S) EE_A' [] 0
< search. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< case IsE. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (stringVal S2) EE_B' O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (stringVal S2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (stringVal S1) EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (stringVal S2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (stringVal S1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (stringVal S2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (stringVal S1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (stringVal S2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (stringVal S1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.21: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 S1 EE1 O2 S2 O3 S E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (appString E1 E2) (stringVal S) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E2 (stringVal S2) EE_B' O3 N3 * EvB4 : S1 ++ S2 = S EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 (stringVal S1) EE1 O2 EvB2' : evalExpr FE EE1 E2 (stringVal S2) EE_B' O3 EvA1' : evalExpr FE EE_A E1 (stringVal S1) EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E2 (stringVal S2) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) EE_A' O ES
< search. Subgoal 1.22: Variables: FE EE_A V EE_B' N Len X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' (name X) V EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' EvB1 : lookupScopes X EE_B' V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (name X) V EE_A' [] 0
< case IsE. Subgoal 1.22: Variables: FE EE_A V EE_B' N Len X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' (name X) V EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' EvB1 : lookupScopes X EE_B' V H1 : is_string X ============================ exists EE_A', <evalExpr {ES}> FE EE_A (name X) V EE_A' [] 0
< apply newNameScopes_lookupScopes to _ _ NNS EvB1. Subgoal 1.22: Variables: FE EE_A V EE_B' N Len X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' (name X) V EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' EvB1 : lookupScopes X EE_B' V H1 : is_string X H2 : lookupScopes X EE_A V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (name X) V EE_A' [] 0
< search. Subgoal 1.23: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (call Fun Args) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals EE_B' O2 N2 * EvB4 : zip ArgNames ArgVals InitEnv EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 * EvB6 : O2 ++ O3 = O EvB7 : lookupScopes RetVar EE2 V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (call Fun Args) V EE_A' O ES
< case IsE. Subgoal 1.23: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (call Fun Args) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals EE_B' O2 N2 * EvB4 : zip ArgNames ArgVals InitEnv EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 * EvB6 : O2 ++ O3 = O EvB7 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args ============================ exists EE_A', <evalExpr {ES}> FE EE_A (call Fun Args) V EE_A' O ES
< EvA2: apply IH_A to _ _ _ _ EvB3 NNS. Subgoal 1.23: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (call Fun Args) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals EE_B' O2 N2 * EvB4 : zip ArgNames ArgVals InitEnv EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 * EvB6 : O2 ++ O3 = O EvB7 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args EvA2 : <evalArgs {ES}> FE EE_A Args ArgVals EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (call Fun Args) V EE_A' O ES
< search. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< case IsE. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< EvA1: apply IH_S to _ _ _ _ EvB2 NNS. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< EvA1': apply drop_ext_size_evalStmt to EvA1. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< EvB1': apply drop_ext_size_evalStmt to EvB2. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< NNS': apply evalStmt_newNameScopes to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< apply evalStmt_isCtx to _ _ _ EvB1'. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< apply evalStmt_isCtx to _ _ _ EvA1'. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< Len_EE_A: apply length_exists_list_pair_string_value to IsA. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< IsLen: apply length_is to Len_EE_A. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< P: apply plus_integer_total to _ IsLen with N1 = 1. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< Len_EE_A+: assert length ([]::EE_A) N4. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< EvA2': apply drop_ext_size_evalExpr to EvA2. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< Len_EE_A': apply evalStmt_keep_scopes to _ _ _ EvA1' Len_EE_A+. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 Len_EE_A' : length EE_A' N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< LenFinal: apply evalExpr_keep_scopes to _ _ _ EvA2' Len_EE_A'. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 Len_EE_A' : length EE_A' N4 LenFinal : length EE_A'1 N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< GEq: apply length_geq_0 to Len_EE_A. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 Len_EE_A' : length EE_A' N4 LenFinal : length EE_A'1 N4 GEq : N1 >= 0 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< L: apply lt_plus_one to P _. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 Len_EE_A' : length EE_A' N4 LenFinal : length EE_A'1 N4 GEq : N1 >= 0 L : N1 < N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< LEq: case GEq. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 Len_EE_A' : length EE_A' N4 LenFinal : length EE_A'1 N4 L : N1 < N4 LEq : 0 <= N1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< apply lesseq_less_integer_transitive to LEq L. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V EE_A'1 O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V EE_A'1 O3 Len_EE_A' : length EE_A' N4 LenFinal : length EE_A'1 N4 L : N1 < N4 LEq : 0 <= N1 H5 : 0 < N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< apply length_cons to LenFinal _. Subgoal 1.24: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 EE1 O2 Scope O3 E1 S EE_A' N1 N4 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (stmtExpr S E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE ([]::EE_B) S EE1 O2 N2 * EvB3 : <evalExpr {ES}> FE EE1 E1 V (Scope::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EvA1 : <evalStmt {ES}> FE ([]::EE_A) S EE_A' O2 N2 EvA1' : evalStmt FE ([]::EE_A) S EE_A' O2 EvB1' : evalStmt FE ([]::EE_B) S EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalExpr {ES}> FE EE_A' E1 V (H::T) O3 N3 Len_EE_A : length EE_A N1 IsLen : is_integer N1 P : 1 + N1 = N4 Len_EE_A+ : length ([]::EE_A) N4 EvA2' : evalExpr FE EE_A' E1 V (H::T) O3 Len_EE_A' : length EE_A' N4 LenFinal : length (H::T) N4 L : N1 < N4 LEq : 0 <= N1 H5 : 0 < N4 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (stmtExpr S E1) V EE_A' O ES
< search. Subgoal 1.25: Variables: FE EE_A EE_B EE_B' O N Len ES VF RF IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (recBuild RF) (recVal VF) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalRecFields {ES}> FE EE_B RF VF EE_B' O ES * ============================ exists EE_A', <evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) EE_A' O ES
< case IsE. Subgoal 1.25: Variables: FE EE_A EE_B EE_B' O N Len ES VF RF IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (recBuild RF) (recVal VF) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalRecFields {ES}> FE EE_B RF VF EE_B' O ES * H1 : is_recFieldExprs RF ============================ exists EE_A', <evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) EE_A' O ES
< apply IH_RF to _ _ _ _ EvB1 NNS. Subgoal 1.25: Variables: FE EE_A EE_B EE_B' O N Len ES VF RF EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (recBuild RF) (recVal VF) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalRecFields {ES}> FE EE_B RF VF EE_B' O ES * H1 : is_recFieldExprs RF H2 : <evalRecFields {ES}> FE EE_A RF VF EE_A' O ES ============================ exists EE_A', <evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) EE_A' O ES
< search. Subgoal 1.26: Variables: FE EE_A EE_B V EE_B' O N Len ES Fields F Rec IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (recFieldAccess Rec F) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) EE_B' O ES * EvB2 : lookup Fields F V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V EE_A' O ES
< case IsE. Subgoal 1.26: Variables: FE EE_A EE_B V EE_B' O N Len ES Fields F Rec IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (recFieldAccess Rec F) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) EE_B' O ES * EvB2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ exists EE_A', <evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS. Subgoal 1.26: Variables: FE EE_A EE_B V EE_B' O N Len ES Fields F Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (recFieldAccess Rec F) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) EE_B' O ES * EvB2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : <evalExpr {ES}> FE EE_A Rec (recVal Fields) EE_A' O ES ============================ exists EE_A', <evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V EE_A' O ES
< search. Subgoal 2.1: Variables: FE EE_A EE_B N Len Scope IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) noop (Scope::EE_B) [] 0 @ NNS : newNameScopes N Len EE_A EE_B ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) noop EE_A' [] 0
< search. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< case IsS. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< EvA1: apply IH_S to _ _ _ _ EvB2 NNS. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< EvB1': apply drop_ext_size_evalStmt to EvB2. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< EvA1': apply drop_ext_size_evalStmt to EvA1. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< NNS': apply evalStmt_newNameScopes to _ _ _ _ EvA1' EvB1' NNS. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply evalStmt_isCtx to _ _ _ EvB1'. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply evalStmt_isCtx to _ _ _ EvA1'. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< Len_EE_A+: apply length_exists_list_pair_string_value to IsA. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A+ : length (Scope::EE_A) N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< Len_EE_A': apply evalStmt_keep_scopes to _ _ _ EvA1' Len_EE_A+. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A+ : length (Scope::EE_A) N1 Len_EE_A' : length EE_A' N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< Len: case Len_EE_A+. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< GEq: apply length_geq_0 to Len. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply length_is to Len. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 H5 : is_integer N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< L: apply lt_plus_one to Len1 _. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 H5 : is_integer N' L : N' < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< LEq: case GEq. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply lesseq_less_integer_transitive to LEq L. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 EE_A' O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply length_cons to Len_EE_A' _. Subgoal 2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 NNS' : newNameScopes N Len (H::T) EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< NNS': case NNS'. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 Len NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< LenB+: apply length_exists_list_pair_string_value to IsB. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 Len NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N5 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< L': apply evalStmt_keep_scopes to _ _ _ EvB1' LenB+. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 Len NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N5 L' : length EE1 N5 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply length_unique to NNS' L'. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N N5 EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 N5 NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N5 L' : length EE1 N5 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< LenB: case LenB+. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 N'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N N5 EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 N5 NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false L' : length EE1 N5 LenB : length EE_B N'1 LenB1 : 1 + N'1 = N5 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply length_is to LenB. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 N'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N N5 EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 N5 NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false L' : length EE1 N5 LenB : length EE_B N'1 LenB1 : 1 + N'1 = N5 H7 : is_integer N'1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< LEq: apply newNameScopes_length to _ LenB. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 N'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N N5 EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 N5 NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false L' : length EE1 N5 LenB : length EE_B N'1 LenB1 : 1 + N'1 = N5 H7 : is_integer N'1 LEq1 : N5 <= N'1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< L: apply lt_plus_one to LenB1 _. Subgoal 2.2.1: Variables: FE EE_A EE_B EE_B' O N Scope ES N2 N3 EE1 O2 O3 S2 S1 N1 N' H T N4 SNames BNames N5 N'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N N5 EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE EE1 S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 EE1 O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : length EE1 N5 NNS'1 : drop N4 (H::T) EE1 NNS'2 : take N4 (H::T) N NNS'3 : names N SNames NNS'4 : names EE1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false L' : length EE1 N5 LenB : length EE_B N'1 LenB1 : 1 + N'1 = N5 H7 : is_integer N'1 LEq1 : N5 <= N'1 L1 : N'1 < N5 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< apply less_lesseq_flip_false to L1 LEq1. Subgoal 2.2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 O3 S2 S1 N1 N' H T BR IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 (H::BR) O2 N2 * EvB3 : <evalStmt {ES}> FE (H::BR) S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 (H::BR) O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) (H::BR) H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : newNameScopes N Len T BR ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< EvA2: apply IH_S to _ _ _ _ EvB3 NNS'. Subgoal 2.2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 O3 S2 S1 N1 N' H T BR EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (seq S1 S2) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalStmt {ES}> FE (Scope::EE_B) S1 (H::BR) O2 N2 * EvB3 : <evalStmt {ES}> FE (H::BR) S2 EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvA1 : <evalStmt {ES}> FE (Scope::EE_A) S1 (H::T) O2 N2 EvB1' : evalStmt FE (Scope::EE_B) S1 (H::BR) O2 EvA1' : evalStmt FE (Scope::EE_A) S1 (H::T) O2 H3 : is_list (is_list (is_pair is_string is_value)) (H::BR) H4 : is_list (is_list (is_pair is_string is_value)) (H::T) Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 NNS' : newNameScopes N Len T BR EvA2 : <evalStmt {ES}> FE (H::T) S2 EE_A'1 O3 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (seq S1 S2) EE_A' O ES
< search. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< case IsS. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 NNS'. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< Len_EE_A+: apply length_exists_list_pair_string_value to IsA. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES Len_EE_A+ : length (Scope::EE_A) N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES Len_EE_A+ : length (Scope::EE_A) N1 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< Len_EE_A': apply evalExpr_keep_scopes to _ _ _ EvA1' Len_EE_A+. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES Len_EE_A+ : length (Scope::EE_A) N1 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< Len: case Len_EE_A+. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< GEq: apply length_geq_0 to Len. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< apply length_is to Len. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 H4 : is_integer N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< L: apply lt_plus_one to Len1 _. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 H4 : is_integer N' L : N' < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< LEq: case GEq. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 H4 : is_integer N' L : N' < N1 LEq : 0 <= N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< apply lesseq_less_integer_transitive to LEq L. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty EE_A' N1 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 H4 : is_integer N' L : N' < N1 LEq : 0 <= N' H5 : 0 < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< apply length_cons to Len_EE_A' _. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope ES EE1 Scope1 V X E Ty N1 N' H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (declare Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V (H::T) O ES EvA1' : evalExpr FE (Scope::EE_A) E V (H::T) O Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H4 : is_integer N' L : N' < N1 LEq : 0 <= N' H5 : 0 < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< search. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< case IsS. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 NNS'. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB1. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< apply evalExpr_isValue to _ _ _ EvB1'. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value V ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS'. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< apply newNameScopes_replaceScopes to _ _ _ _ NNS'' EvB2. Subgoal 2.4: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 E X EE_A' RA IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assign X E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : replaceScopes X V EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 H6 : replaceScopes X V EE_A' RA H7 : newNameScopes N Len RA EE_B' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< search. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< case IsS. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 NNS'. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB1. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< apply evalExpr_isValue to _ _ _ EvB1'. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS'. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< apply newNameScopes_lookupScopes to _ _ NNS' EvB2. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 H7 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< IsRF: apply lookupScopes_is to _ EvB2. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 H7 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsRF : is_value (recVal FieldVals) IsRF1 : is_string Rec ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< case IsRF. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 H7 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsRF1 : is_string Rec H8 : is_list (is_pair is_string is_value) FieldVals ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< apply updateRecFields_is to _ _ _ EvB3. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 H7 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsRF1 : is_string Rec H8 : is_list (is_pair is_string is_value) FieldVals H9 : is_list (is_pair is_string is_value) NewVals ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< apply newNameScopes_replaceScopes to _ _ _ _ NNS'' EvB4. Subgoal 2.5: Variables: FE EE_A EE_B EE_B' O N Len Scope ES V EE1 FieldVals NewVals E Fields Rec EE_A' RA IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V EE1 O ES * EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) EvB3 : updateRecFields Fields V FieldVals NewVals EvB4 : replaceScopes Rec (recVal NewVals) EE1 EE_B' NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O ES EvB1' : evalExpr FE (Scope::EE_B) E V EE1 O EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_value V NNS'' : newNameScopes N Len EE_A' EE1 H7 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) IsRF1 : is_string Rec H8 : is_list (is_pair is_string is_value) FieldVals H9 : is_list (is_pair is_string is_value) NewVals H10 : replaceScopes Rec (recVal NewVals) EE_A' RA H11 : newNameScopes N Len RA EE_B' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< search. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< case IsS. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS'. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< IsA': apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS'. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA2: apply IH_S to _ _ _ _ EvB3 NNS''. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< LenA': apply length_exists_list_pair_string_value to IsA'. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< IsN1: apply length_is to LenA'. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< LenA'+: assert length ([]::EE_A') N4. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA2': apply drop_ext_size_evalStmt to EvA2. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') Th EE_A'1 O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< Len'': apply evalStmt_keep_scopes to _ _ _ EvA2' LenA'+. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') Th EE_A'1 O3 Len'' : length EE_A'1 N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< apply cons_length to LenA'+. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') Th EE_A'1 O3 Len'' : length EE_A'1 N4 H5 : N4 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< apply length_cons to Len'' _. Subgoal 2.6: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' N1 N4 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) Th (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Th (H::T) O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') Th (H::T) O3 Len'' : length (H::T) N4 H5 : N4 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< search. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< case IsS. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS'. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< IsA': apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS'. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA2: apply IH_S to _ _ _ _ EvB3 NNS''. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< LenA': apply length_exists_list_pair_string_value to IsA'. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< IsN1: apply length_is to LenA'. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< LenA'+: assert length ([]::EE_A') N4. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA2': apply drop_ext_size_evalStmt to EvA2. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') El EE_A'1 O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< Len'': apply evalStmt_keep_scopes to _ _ _ EvA2' LenA'+. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') El EE_A'1 O3 Len'' : length EE_A'1 N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< apply cons_length to LenA'+. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' EE_A'1 N1 N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El EE_A'1 O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') El EE_A'1 O3 Len'' : length EE_A'1 N4 H5 : N4 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< apply length_cons to Len'' _. Subgoal 2.7: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 EE1 O2 Scope1 O3 El Th Cond EE_A' N1 N4 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE1 O2 N2 * EvB3 : <evalStmt {ES}> FE ([]::EE1) El (Scope1::EE_B') O3 N3 * EvB4 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O2 N2 EvA1' : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O2 EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal EE1 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') El (H::T) O3 N3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N4 LenA'+ : length ([]::EE_A') N4 EvA2' : evalStmt FE ([]::EE_A') El (H::T) O3 Len'' : length (H::T) N4 H5 : N4 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< search. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< case IsS. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB3. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsA': apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvA2: apply IH_S to _ _ _ _ EvB4 NNS''. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvB2': apply drop_ext_size_evalStmt to EvB4. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvA2': apply drop_ext_size_evalStmt to EvA2. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenA': apply length_exists_list_pair_string_value to IsA'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 LenA' : length EE_A' N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsN1: apply length_is to LenA'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 N1 N6 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenA'+: assert length ([]::EE_A') N6. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 N1 N6 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< Len'': apply evalStmt_keep_scopes to _ _ _ EvA2' LenA'+. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 N1 N6 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length EE_A'1 N6 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply cons_length to LenA'+. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' EE_A'1 N1 N6 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body EE_A'1 O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body EE_A'1 O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length EE_A'1 N6 H4 : N6 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_cons to Len'' _. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsB+: apply evalStmt_isCtx to _ _ _ EvB2'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsB': case IsB+. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsA+: apply evalStmt_isCtx to _ _ _ EvA2'. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA+ : is_list (is_list (is_pair is_string is_value)) (H::T) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsA': case IsA+. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS+: apply evalStmt_newNameScopes to _ _ _ _ EvA2' EvB2' _. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenB+: apply length_exists_list_pair_string_value to IsB. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenB: case LenB+ (keep). Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LEq: apply newNameScopes_length to NNS LenB. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenEE1: apply evalExpr_keep_scopes to _ _ _ EvB1' LenB+. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsN2: apply length_is to LenEE1. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< P: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N8 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenEE1+: assert length ([]::EE1) N8. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N8 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvB2' LenEE1+. Subgoal 2.8: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N8 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T NNS+ : newNameScopes N Len (H::T) (Scope1::EE2) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 LenEE2+ : length (Scope1::EE2) N8 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS_: case NNS+. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 LenEE2+ : length (Scope1::EE2) N8 NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_unique to LenEE2+ NNS_. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = Len LenEE1+ : length ([]::EE1) Len LenEE2+ : length (Scope1::EE2) Len NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_is to LenB. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = Len LenEE1+ : length ([]::EE1) Len LenEE2+ : length (Scope1::EE2) Len NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_is to LenEE1. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = Len LenEE1+ : length ([]::EE1) Len LenEE2+ : length (Scope1::EE2) Len NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer N' H6 : is_integer N7 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L1: apply lt_plus_one to LenB1 _. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = Len LenEE1+ : length ([]::EE1) Len LenEE2+ : length (Scope1::EE2) Len NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer N' H6 : is_integer N7 L1 : N' < N7 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L2: apply lt_plus_one to P1 _. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = Len LenEE1+ : length ([]::EE1) Len LenEE2+ : length (Scope1::EE2) Len NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer N' H6 : is_integer N7 L1 : N' < N7 L2 : N7 < Len ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L: apply less_integer_transitive to L1 L2. Subgoal 2.8.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 H T N7 N' N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (H::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (H::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (H::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) H IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = Len LenEE1+ : length ([]::EE1) Len LenEE2+ : length (Scope1::EE2) Len NNS_ : length (Scope1::EE2) Len NNS_1 : drop N9 (H::T) (Scope1::EE2) NNS_2 : take N9 (H::T) N NNS_3 : names N SNames NNS_4 : names (Scope1::EE2) BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer N' H6 : is_integer N7 L1 : N' < N7 L2 : N7 < Len L : N' < Len ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply less_lesseq_flip_false to L LEq. Subgoal 2.8.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N7 N' N8 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 LenEE2+ : length (Scope1::EE2) N8 NNS_ : newNameScopes N Len T EE2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS_: case NNS_. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N7 N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 LenEE2+ : length (Scope1::EE2) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenEE2: case LenEE2+. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N7 N' N8 N9 SNames BNames N'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false LenEE2 : length EE2 N'1 LenEE3 : 1 + N'1 = N8 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_unique to LenEE2 NNS_. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N7 N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false LenEE2 : length EE2 Len LenEE3 : 1 + Len = N8 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_is to NNS_. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N7 N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false LenEE2 : length EE2 Len LenEE3 : 1 + Len = N8 H5 : is_integer Len ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_is to LenB. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N7 N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false LenEE2 : length EE2 Len LenEE3 : 1 + Len = N8 H5 : is_integer Len H6 : is_integer N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply plus_integer_unique_addend to _ _ _ P1 LenEE3. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) Len LenB : length EE_B N' LenB1 : 1 + N' = Len LEq : Len <= N' LenEE1 : length EE1 Len IsN2 : is_integer Len P1 : 1 + Len = N8 LenEE1+ : length ([]::EE1) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false LenEE2 : length EE2 Len LenEE3 : 1 + Len = N8 H5 : is_integer Len H6 : is_integer N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L: apply lt_plus_one to LenB1 _. Subgoal 2.8.2.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_A' N1 N6 T N' N8 N9 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::EE2) O3 N2 * EvB5 : <evalStmt {ES}> FE EE2 (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::T) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::T) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::T) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) EE2 IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) T LenB+ : length (Scope::EE_B) Len LenB : length EE_B N' LenB1 : 1 + N' = Len LEq : Len <= N' LenEE1 : length EE1 Len IsN2 : is_integer Len P1 : 1 + Len = N8 LenEE1+ : length ([]::EE1) N8 NNS_ : length EE2 Len NNS_1 : drop N9 T EE2 NNS_2 : take N9 T N NNS_3 : names N SNames NNS_4 : names EE2 BNames NNS_5 : forall X, mem X SNames -> mem X BNames -> false LenEE2 : length EE2 Len LenEE3 : 1 + Len = N8 H5 : is_integer Len H6 : is_integer N' L : N' < Len ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply less_lesseq_flip_false to L LEq. Subgoal 2.8.2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 O3 O4 O12 Body Cond EE_A' N1 N6 N7 N' N8 BR S1 AR IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::(S1::BR)) O3 N2 * EvB5 : <evalStmt {ES}> FE (S1::BR) (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::(S1::AR)) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::(S1::BR)) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::(S1::AR)) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::(S1::AR)) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) (S1::BR) IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) (S1::AR) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 LenEE2+ : length (Scope1::(S1::BR)) N8 NNS_ : newNameScopes N Len AR BR ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply IH_S to _ _ _ _ EvB5 NNS_. Subgoal 2.8.2.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 EE1 O2 Scope1 O3 O4 O12 Body Cond EE_A' N1 N6 N7 N' N8 BR S1 AR EE_A'2 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N3 + N5 = ES EvB2 : N2 + N4 = N5 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) Cond trueVal EE1 O2 N3 * EvB4 : <evalStmt {ES}> FE ([]::EE1) Body (Scope1::(S1::BR)) O3 N2 * EvB5 : <evalStmt {ES}> FE (S1::BR) (while Cond Body) EE_B' O4 N4 * EvB6 : O2 ++ O3 = O12 EvB7 : O12 ++ O4 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) Cond trueVal EE_A' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A' NNS'' : newNameScopes N Len EE_A' EE1 EvA2 : <evalStmt {ES}> FE ([]::EE_A') Body (Scope1::(S1::AR)) O3 N2 EvB2' : evalStmt FE ([]::EE1) Body (Scope1::(S1::BR)) O3 EvA2' : evalStmt FE ([]::EE_A') Body (Scope1::(S1::AR)) O3 LenA' : length EE_A' N1 IsN1 : is_integer N1 P : 1 + N1 = N6 LenA'+ : length ([]::EE_A') N6 Len'' : length (Scope1::(S1::AR)) N6 H4 : N6 > 0 IsB' : is_list (is_pair is_string is_value) Scope1 IsB'1 : is_list (is_list (is_pair is_string is_value)) (S1::BR) IsA'1 : is_list (is_pair is_string is_value) Scope1 IsA'2 : is_list (is_list (is_pair is_string is_value)) (S1::AR) LenB+ : length (Scope::EE_B) N7 LenB : length EE_B N' LenB1 : 1 + N' = N7 LEq : Len <= N' LenEE1 : length EE1 N7 IsN2 : is_integer N7 P1 : 1 + N7 = N8 LenEE1+ : length ([]::EE1) N8 LenEE2+ : length (Scope1::(S1::BR)) N8 NNS_ : newNameScopes N Len AR BR H5 : <evalStmt {ES}> FE (S1::AR) (while Cond Body) EE_A'2 O4 N4 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< search. Subgoal 2.9: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Body Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE_B' O ES * ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.9: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Body Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE_B' O ES * NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< case IsS. Subgoal 2.9: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Body Cond IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE_B' O ES * NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS+. Subgoal 2.9: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Body Cond EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (while Cond Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal EE_B' O ES * NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr Cond H2 : is_stmt Body H3 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal EE_A' O ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< search. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< case IsS. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< EvA1: apply IH_S to _ _ _ _ EvB1 NNS'. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< LenA+: apply length_exists_list_pair_string_value to IsA. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< IsN1: apply length_is to LenA+. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< P: apply plus_integer_total to _ IsN1 with N1 = 1. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 N3 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 P : 1 + N1 = N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< LenA++: assert length ([]::(Scope::EE_A)) N3. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 N3 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenA++ : length ([]::(Scope::EE_A)) N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< EvA1': apply drop_ext_size_evalStmt to EvA1. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 N3 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenA++ : length ([]::(Scope::EE_A)) N3 EvA1' : evalStmt FE ([]::(Scope::EE_A)) S1 EE_A' O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< LenA': apply evalStmt_keep_scopes to _ _ _ EvA1' LenA++. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 N3 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenA++ : length ([]::(Scope::EE_A)) N3 EvA1' : evalStmt FE ([]::(Scope::EE_A)) S1 EE_A' O LenA' : length EE_A' N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< apply cons_length to LenA++. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 EE_A' N1 N3 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 EE_A' O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenA++ : length ([]::(Scope::EE_A)) N3 EvA1' : evalStmt FE ([]::(Scope::EE_A)) S1 EE_A' O LenA' : length EE_A' N3 H2 : N3 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< apply length_cons to LenA' _. Subgoal 2.10: Variables: FE EE_A EE_B EE_B' O N Len Scope ES Scope1 S1 N1 N3 H T IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (scopeStmt S1) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) S1 (Scope1::EE_B') O ES * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_stmt S1 EvA1 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) S1 (H::T) O ES LenA+ : length (Scope::EE_A) N1 IsN1 : is_integer N1 P : 1 + N1 = N3 LenA++ : length ([]::(Scope::EE_A)) N3 EvA1' : evalStmt FE ([]::(Scope::EE_A)) S1 (H::T) O LenA' : length (H::T) N3 H2 : N3 > 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (scopeStmt S1) EE_A' O ES
< search. Subgoal 2.11: Variables: FE EE_A EE_B EE_B' O N Len Scope ES I O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) EE_B' O2 ES * EvB2 : O2 ++ [intVal I] = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.11: Variables: FE EE_A EE_B EE_B' O N Len Scope ES I O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) EE_B' O2 ES * EvB2 : O2 ++ [intVal I] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< case IsS. Subgoal 2.11: Variables: FE EE_A EE_B EE_B' O N Len Scope ES I O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) EE_B' O2 ES * EvB2 : O2 ++ [intVal I] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS+. Subgoal 2.11: Variables: FE EE_A EE_B EE_B' O N Len Scope ES I O2 E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) EE_B' O2 ES * EvB2 : O2 ++ [intVal I] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E H2 : <evalExpr {ES}> FE (Scope::EE_A) E (intVal I) EE_A' O2 ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< search. Subgoal 2.12: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O2 ES * EvB2 : O2 ++ [trueVal] = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.12: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O2 ES * EvB2 : O2 ++ [trueVal] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< case IsS. Subgoal 2.12: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O2 ES * EvB2 : O2 ++ [trueVal] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS+. Subgoal 2.12: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O2 ES * EvB2 : O2 ++ [trueVal] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E H2 : <evalExpr {ES}> FE (Scope::EE_A) E trueVal EE_A' O2 ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< search. Subgoal 2.13: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal EE_B' O2 ES * EvB2 : O2 ++ [falseVal] = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.13: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal EE_B' O2 ES * EvB2 : O2 ++ [falseVal] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< case IsS. Subgoal 2.13: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal EE_B' O2 ES * EvB2 : O2 ++ [falseVal] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS+. Subgoal 2.13: Variables: FE EE_A EE_B EE_B' O N Len Scope ES O2 E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal EE_B' O2 ES * EvB2 : O2 ++ [falseVal] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E H2 : <evalExpr {ES}> FE (Scope::EE_A) E falseVal EE_A' O2 ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< search. Subgoal 2.14: Variables: FE EE_A EE_B EE_B' O N Len Scope ES S1 O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) EE_B' O2 ES * EvB2 : O2 ++ [stringVal S1] = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.14: Variables: FE EE_A EE_B EE_B' O N Len Scope ES S1 O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) EE_B' O2 ES * EvB2 : O2 ++ [stringVal S1] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< case IsS. Subgoal 2.14: Variables: FE EE_A EE_B EE_B' O N Len Scope ES S1 O2 E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) EE_B' O2 ES * EvB2 : O2 ++ [stringVal S1] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< apply IH_E to _ _ _ _ EvB1 NNS+. Subgoal 2.14: Variables: FE EE_A EE_B EE_B' O N Len Scope ES S1 O2 E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (printVal E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) EE_B' O2 ES * EvB2 : O2 ++ [stringVal S1] = O NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_expr E H2 : <evalExpr {ES}> FE (Scope::EE_A) E (stringVal S1) EE_A' O2 ES ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< search. Subgoal 3.1: Variables: FE EE_A EE_B' N Len IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalArgs {ES}> FE EE_B' nilArgs [] EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalArgs {ES}> FE EE_A nilArgs [] EE_A' [] 0
< search. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< case IsA. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< EvA2: apply IH_A to _ _ _ _ EvB3 NNS'. Subgoal 3.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 Rest E EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalArgs {ES}> FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalArgs {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalArgs {ES}> FE EE_A' Rest VRest EE_A'1 O3 N3 ============================ exists EE_A', <evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O ES
< search. Subgoal 4.1: Variables: FE EE_A EE_B' N Len IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalRecFields {ES}> FE EE_B' nilRecFieldExprs [] EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalRecFields {ES}> FE EE_A nilRecFieldExprs [] EE_A' [] 0
< search. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< case IsRF. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB2. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< EvA2: apply IH_RF to _ _ _ _ EvB3 NNS'. Subgoal 4.2: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 EE1 O2 O3 VRest V1 F Rest E EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalRecFields {ES}> FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : N2 + N3 = ES EvB2 : <evalExpr {ES}> FE EE_B E V1 EE1 O2 N2 * EvB3 : <evalRecFields {ES}> FE EE1 Rest VRest EE_B' O3 N3 * EvB4 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvA1 : <evalExpr {ES}> FE EE_A E V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E V1 EE1 O2 EvA1' : evalExpr FE EE_A E V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' EvA2 : <evalRecFields {ES}> FE EE_A' Rest VRest EE_A'1 O3 N3 ============================ exists EE_A', <evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O ES
< search. Proof completed.
< Theorem evalExpr_newNameScopes_exists : forall FE EE_A EE_B E V EE_B' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_B E V EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalExpr FE EE_A E V EE_A' O. ============================ forall FE EE_A EE_B E V EE_B' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_B E V EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalExpr FE EE_A E V EE_A' O
< intros IsE IsFE IsA IsB Ev NNS. Variables: FE EE_A EE_B E V EE_B' O N Len IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalExpr FE EE_B E V EE_B' O NNS : newNameScopes N Len EE_A EE_B ============================ exists EE_A', evalExpr FE EE_A E V EE_A' O
< Ev': apply add_ext_size_evalExpr to Ev. Variables: FE EE_A EE_B E V EE_B' O N Len N1 IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalExpr FE EE_B E V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalExpr {ES}> FE EE_B E V EE_B' O N1 ============================ exists EE_A', evalExpr FE EE_A E V EE_A' O
< E: apply evalExpr_newNameScopes_exists_ES to IsE IsFE IsA IsB Ev' NNS. Variables: FE EE_A EE_B E V EE_B' O N Len N1 EE_A' IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalExpr FE EE_B E V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalExpr {ES}> FE EE_B E V EE_B' O N1 E : <evalExpr {ES}> FE EE_A E V EE_A' O N1 ============================ exists EE_A', evalExpr FE EE_A E V EE_A' O
< apply drop_ext_size_evalExpr to E. Variables: FE EE_A EE_B E V EE_B' O N Len N1 EE_A' IsE : is_expr E IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalExpr FE EE_B E V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalExpr {ES}> FE EE_B E V EE_B' O N1 E : <evalExpr {ES}> FE EE_A E V EE_A' O N1 H1 : evalExpr FE EE_A E V EE_A' O ============================ exists EE_A', evalExpr FE EE_A E V EE_A' O
< search. Proof completed.
< Theorem evalStmt_newNameScopes_exists : forall FE EE_A EE_B S EE_B' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_B) S EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalStmt FE (Scope::EE_A) S EE_A' O. ============================ forall FE EE_A EE_B S EE_B' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_B) S EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalStmt FE (Scope::EE_A) S EE_A' O
< intros IsS IsFE IsA IsB Ev NNS. Variables: FE EE_A EE_B S EE_B' O N Len Scope IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) Ev : evalStmt FE (Scope::EE_B) S EE_B' O NNS : newNameScopes N Len EE_A EE_B ============================ exists EE_A', evalStmt FE (Scope::EE_A) S EE_A' O
< Ev': apply add_ext_size_evalStmt to Ev. Variables: FE EE_A EE_B S EE_B' O N Len Scope N1 IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) Ev : evalStmt FE (Scope::EE_B) S EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O N1 ============================ exists EE_A', evalStmt FE (Scope::EE_A) S EE_A' O
< E: apply evalStmt_newNameScopes_exists_ES to IsS IsFE IsA IsB Ev' NNS. Variables: FE EE_A EE_B S EE_B' O N Len Scope N1 EE_A' IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) Ev : evalStmt FE (Scope::EE_B) S EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O N1 E : <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O N1 ============================ exists EE_A', evalStmt FE (Scope::EE_A) S EE_A' O
< apply drop_ext_size_evalStmt to E. Variables: FE EE_A EE_B S EE_B' O N Len Scope N1 EE_A' IsS : is_stmt S IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) Ev : evalStmt FE (Scope::EE_B) S EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O N1 E : <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O N1 H1 : evalStmt FE (Scope::EE_A) S EE_A' O ============================ exists EE_A', evalStmt FE (Scope::EE_A) S EE_A' O
< search. Proof completed.
< Theorem evalArgs_newNameScopes_exists : forall FE EE_A EE_B A V EE_B' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_B A V EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalArgs FE EE_A A V EE_A' O. ============================ forall FE EE_A EE_B A V EE_B' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_B A V EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalArgs FE EE_A A V EE_A' O
< intros IsAr IsFE IsA IsB Ev NNS. Variables: FE EE_A EE_B A V EE_B' O N Len IsAr : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalArgs FE EE_B A V EE_B' O NNS : newNameScopes N Len EE_A EE_B ============================ exists EE_A', evalArgs FE EE_A A V EE_A' O
< Ev': apply add_ext_size_evalArgs to Ev. Variables: FE EE_A EE_B A V EE_B' O N Len N1 IsAr : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalArgs FE EE_B A V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalArgs {ES}> FE EE_B A V EE_B' O N1 ============================ exists EE_A', evalArgs FE EE_A A V EE_A' O
< E: apply evalArgs_newNameScopes_exists_ES to IsAr IsFE IsA IsB Ev' NNS. Variables: FE EE_A EE_B A V EE_B' O N Len N1 EE_A' IsAr : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalArgs FE EE_B A V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalArgs {ES}> FE EE_B A V EE_B' O N1 E : <evalArgs {ES}> FE EE_A A V EE_A' O N1 ============================ exists EE_A', evalArgs FE EE_A A V EE_A' O
< apply drop_ext_size_evalArgs to E. Variables: FE EE_A EE_B A V EE_B' O N Len N1 EE_A' IsAr : is_args A IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalArgs FE EE_B A V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalArgs {ES}> FE EE_B A V EE_B' O N1 E : <evalArgs {ES}> FE EE_A A V EE_A' O N1 H1 : evalArgs FE EE_A A V EE_A' O ============================ exists EE_A', evalArgs FE EE_A A V EE_A' O
< search. Proof completed.
< Theorem evalRecFields_newNameScopes_exists : forall FE EE_A EE_B RF V EE_B' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_B RF V EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalRecFields FE EE_A RF V EE_A' O. ============================ forall FE EE_A EE_B RF V EE_B' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_B RF V EE_B' O -> newNameScopes N Len EE_A EE_B -> exists EE_A', evalRecFields FE EE_A RF V EE_A' O
< intros IsRF IsFE IsA IsB Ev NNS. Variables: FE EE_A EE_B RF V EE_B' O N Len IsRF : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalRecFields FE EE_B RF V EE_B' O NNS : newNameScopes N Len EE_A EE_B ============================ exists EE_A', evalRecFields FE EE_A RF V EE_A' O
< Ev': apply add_ext_size_evalRecFields to Ev. Variables: FE EE_A EE_B RF V EE_B' O N Len N1 IsRF : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalRecFields FE EE_B RF V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalRecFields {ES}> FE EE_B RF V EE_B' O N1 ============================ exists EE_A', evalRecFields FE EE_A RF V EE_A' O
< E: apply evalRecFields_newNameScopes_exists_ES to IsRF IsFE IsA IsB Ev' NNS. Variables: FE EE_A EE_B RF V EE_B' O N Len N1 EE_A' IsRF : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalRecFields FE EE_B RF V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalRecFields {ES}> FE EE_B RF V EE_B' O N1 E : <evalRecFields {ES}> FE EE_A RF V EE_A' O N1 ============================ exists EE_A', evalRecFields FE EE_A RF V EE_A' O
< apply drop_ext_size_evalRecFields to E. Variables: FE EE_A EE_B RF V EE_B' O N Len N1 EE_A' IsRF : is_recFieldExprs RF IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B Ev : evalRecFields FE EE_B RF V EE_B' O NNS : newNameScopes N Len EE_A EE_B Ev' : <evalRecFields {ES}> FE EE_B RF V EE_B' O N1 E : <evalRecFields {ES}> FE EE_A RF V EE_A' O N1 H1 : evalRecFields FE EE_A RF V EE_A' O ============================ exists EE_A', evalRecFields FE EE_A RF V EE_A' O
< search. Proof completed.
< Define ctx_names : (list (list (pair K I))) -> (list (list K)) -> prop by ctx_names [] []; ctx_names (A::ARest) (B::BRest) := ((forall K I, mem (K, I) A -> mem K B) /\ (forall K, mem K B -> exists I, mem (K, I) A)) /\ ctx_names ARest BRest.
< Theorem ctx_names_add [K, I] : forall A B AS BS (K : K) (I : I), ctx_names (AS::A) (BS::B) -> ctx_names (((K, I)::AS)::A) ((K::BS)::B). ============================ forall A B AS BS K I, ctx_names (AS::A) (BS::B) -> ctx_names (((K, I)::AS)::A) ((K::BS)::B)
< intros CN. Variables: A B AS BS K I CN : ctx_names (AS::A) (BS::B) ============================ ctx_names (((K, I)::AS)::A) ((K::BS)::B)
< CN: case CN. Variables: A B AS BS K I CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B ============================ ctx_names (((K, I)::AS)::A) ((K::BS)::B)
< unfold . Subgoal 1: Variables: A B AS BS K I CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B ============================ forall K1 I1, mem (K1, I1) ((K, I)::AS) -> mem K1 (K::BS)
< intros M. Subgoal 1: Variables: A B AS BS K I K1 I1 CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B M : mem (K1, I1) ((K, I)::AS) ============================ mem K1 (K::BS)
< M: case M. Subgoal 1.1: Variables: A B AS BS K I CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B ============================ mem K (K::BS)
< search. Subgoal 1.2: Variables: A B AS BS K I K1 I1 CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B M : mem (K1, I1) AS ============================ mem K1 (K::BS)
< apply CN to M. Subgoal 1.2: Variables: A B AS BS K I K1 I1 CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B M : mem (K1, I1) AS H1 : mem K1 BS ============================ mem K1 (K::BS)
< search. Subgoal 2: Variables: A B AS BS K I CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B ============================ forall K1, mem K1 (K::BS) -> exists I1, mem (K1, I1) ((K, I)::AS)
< intros M. Subgoal 2: Variables: A B AS BS K I K1 CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B M : mem K1 (K::BS) ============================ exists I1, mem (K1, I1) ((K, I)::AS)
< M: case M. Subgoal 2.1: Variables: A B AS BS K I CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B ============================ exists I1, mem (K, I1) ((K, I)::AS)
< search. Subgoal 2.2: Variables: A B AS BS K I K1 CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B M : mem K1 BS ============================ exists I1, mem (K1, I1) ((K, I)::AS)
< apply CN1 to M. Subgoal 2.2: Variables: A B AS BS K I K1 I1 CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B M : mem K1 BS H1 : mem (K1, I1) AS ============================ exists I1, mem (K1, I1) ((K, I)::AS)
< search. Subgoal 3: Variables: A B AS BS K I CN : forall K I, mem (K, I) AS -> mem K BS CN1 : forall K, mem K BS -> exists I, mem (K, I) AS CN2 : ctx_names A B ============================ ctx_names A B
< search. Proof completed.
< Theorem ctx_names_add_scope [K, I] : forall (A : list (list (pair K I))) B, ctx_names A B -> ctx_names ([]::A) ([]::B). ============================ forall A B, ctx_names A B -> ctx_names ([]::A) ([]::B)
< intros CN. Variables: A B CN : ctx_names A B ============================ ctx_names ([]::A) ([]::B)
< unfold . Subgoal 1: Variables: A B CN : ctx_names A B ============================ forall K I, mem (K, I) [] -> mem K []
< intros M. Subgoal 1: Variables: A B K I CN : ctx_names A B M : mem (K, I) [] ============================ mem K []
< case M. Subgoal 2: Variables: A B CN : ctx_names A B ============================ forall K, mem K [] -> exists I, mem (K, I) []
< intros M. Subgoal 2: Variables: A B K CN : ctx_names A B M : mem K [] ============================ exists I, mem (K, I) []
< case M. Subgoal 3: Variables: A B CN : ctx_names A B ============================ ctx_names A B
< search. Proof completed.
< Theorem ctx_names_lookupScopes [K, I] : forall A B (K : K) (I : I), ctx_names A B -> lookupScopes K A I -> mems K B. ============================ forall A B K I, ctx_names A B -> lookupScopes K A I -> mems K B
< induction on 2. IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B ============================ forall A B K I, ctx_names A B -> lookupScopes K A I @ -> mems K B
< intros CN L. Variables: A B K I IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B CN : ctx_names A B L : lookupScopes K A I @ ============================ mems K B
< L: case L. Subgoal 1: Variables: B K I Rest L IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B CN : ctx_names (L::Rest) B L : lookup L K I ============================ mems K B
< M: apply lookup_mem to L. Subgoal 1: Variables: B K I Rest L IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B CN : ctx_names (L::Rest) B L : lookup L K I M : mem (K, I) L ============================ mems K B
< CN: case CN. Subgoal 1: Variables: K I Rest L BRest B1 IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B L : lookup L K I M : mem (K, I) L CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ mems K (B1::BRest)
< apply CN to M. Subgoal 1: Variables: K I Rest L BRest B1 IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B L : lookup L K I M : mem (K, I) L CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest H1 : mem K B1 ============================ mems K (B1::BRest)
< search. Subgoal 2: Variables: B K I Rest L IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B CN : ctx_names (L::Rest) B L : no_lookup L K L1 : lookupScopes K Rest I * ============================ mems K B
< CN: case CN. Subgoal 2: Variables: K I Rest L BRest B1 IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B L : no_lookup L K L1 : lookupScopes K Rest I * CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ mems K (B1::BRest)
< apply IH to CN2 L1. Subgoal 2: Variables: K I Rest L BRest B1 IH : forall A B K I, ctx_names A B -> lookupScopes K A I * -> mems K B L : no_lookup L K L1 : lookupScopes K Rest I * CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest H1 : mems K BRest ============================ mems K (B1::BRest)
< search. Proof completed.
< Theorem ctx_names_replaceScopes : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' -> ctx_names A' B. ============================ forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' -> ctx_names A' B
< induction on 4. IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B ============================ forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' @ -> ctx_names A' B
< intros IsA IsB CN RS. Variables: A B X V A' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list is_string) B CN : ctx_names A B RS : replaceScopes X V A A' @ ============================ ctx_names A' B
< RS: case RS. Subgoal 1: Variables: B X V I Rest LRemain L IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) B CN : ctx_names (L::Rest) B RS : mem (X, I) L RS1 : remove_all L X LRemain ============================ ctx_names (((X, V)::LRemain)::Rest) B
< CN: case CN. Subgoal 1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ ctx_names (((X, V)::LRemain)::Rest) (B1::BRest)
< unfold . Subgoal 1.1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ forall K I, mem (K, I) ((X, V)::LRemain) -> mem K B1
< intros M. Subgoal 1.1: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem (K, I1) ((X, V)::LRemain) ============================ mem K B1
< M: case M. Subgoal 1.1.1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ mem X B1
< apply CN to RS. Subgoal 1.1.1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest H1 : mem X B1 ============================ mem X B1
< search. Subgoal 1.1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem (K, I1) LRemain ============================ mem K B1
< M': apply mem_after_remove_all_before to RS1 M. Subgoal 1.1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem (K, I1) LRemain M' : mem (K, I1) L ============================ mem K B1
< apply CN to M'. Subgoal 1.1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem (K, I1) LRemain M' : mem (K, I1) L H1 : mem K B1 ============================ mem K B1
< search. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ forall K, mem K B1 -> exists I, mem (K, I) ((X, V)::LRemain)
< intros M. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 ============================ exists I, mem (K, I) ((X, V)::LRemain)
< M': apply CN1 to M. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L ============================ exists I, mem (K, I) ((X, V)::LRemain)
< case IsA. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists I, mem (K, I) ((X, V)::LRemain)
< IsKP: apply mem_is to _ M'. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsKP : is_pair is_string is_value (K, I1) ============================ exists I, mem (K, I) ((X, V)::LRemain)
< IsK: case IsKP. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string K IsK1 : is_value I1 ============================ exists I, mem (K, I) ((X, V)::LRemain)
< IsXP: apply mem_is to _ RS. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string K IsK1 : is_value I1 IsXP : is_pair is_string is_value (X, I) ============================ exists I, mem (K, I) ((X, V)::LRemain)
< IsX: case IsXP. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string K IsK1 : is_value I1 IsX : is_string X IsX1 : is_value I ============================ exists I, mem (K, I) ((X, V)::LRemain)
< Or: apply is_string_eq_or_not to IsK IsX. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string K IsK1 : is_value I1 IsX : is_string X IsX1 : is_value I Or : K = X \/ (K = X -> false) ============================ exists I, mem (K, I) ((X, V)::LRemain)
< E: case Or. Subgoal 1.2.1: Variables: X V I Rest LRemain L BRest B1 I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem X B1 M' : mem (X, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string X IsK1 : is_value I1 IsX : is_string X IsX1 : is_value I ============================ exists I, mem (X, I) ((X, V)::LRemain)
< search. Subgoal 1.2.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string K IsK1 : is_value I1 IsX : is_string X IsX1 : is_value I E : K = X -> false ============================ exists I, mem (K, I) ((X, V)::LRemain)
< apply mem_before_remove_all_after to RS1 M' _. Subgoal 1.2.2: Variables: X V I Rest LRemain L BRest B1 K I1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest M : mem K B1 M' : mem (K, I1) L H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsK : is_string K IsK1 : is_value I1 IsX : is_string X IsX1 : is_value I E : K = X -> false H3 : mem (K, I1) LRemain ============================ exists I, mem (K, I) ((X, V)::LRemain)
< search. Subgoal 1.3: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : mem (X, I) L RS1 : remove_all L X LRemain CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ ctx_names Rest BRest
< search. Subgoal 2: Variables: B X V New L Rest IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) B CN : ctx_names (L::Rest) B RS : no_lookup L X RS1 : replaceScopes X V Rest New * ============================ ctx_names (L::New) B
< CN: case CN. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list is_string) (B1::BRest) RS : no_lookup L X RS1 : replaceScopes X V Rest New * CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest ============================ ctx_names (L::New) (B1::BRest)
< case IsA. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B IsB : is_list (is_list is_string) (B1::BRest) RS : no_lookup L X RS1 : replaceScopes X V Rest New * CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ ctx_names (L::New) (B1::BRest)
< case IsB. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B RS : no_lookup L X RS1 : replaceScopes X V Rest New * CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list is_string B1 H4 : is_list (is_list is_string) BRest ============================ ctx_names (L::New) (B1::BRest)
< apply IH to _ _ CN2 RS1. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list is_string) B -> ctx_names A B -> replaceScopes X V A A' * -> ctx_names A' B RS : no_lookup L X RS1 : replaceScopes X V Rest New * CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list is_string B1 H4 : is_list (is_list is_string) BRest H5 : ctx_names New BRest ============================ ctx_names (L::New) (B1::BRest)
< search. Proof completed.
< Extensible_Theorem evalExpr_ctx_names : forall FE EE E V EE' O Ctx N, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> EN : exprNames Ctx E N -> Ev : evalExpr FE EE E V EE' O -> ctx_names EE' Ctx on Ev as IH_E, evalStmt_ctx_names : forall FE EE S EE' O Ctx Ctx' N, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> SN : stmtNames Ctx S N Ctx' -> Ev : evalStmt FE EE S EE' O -> ctx_names EE' Ctx' on Ev as IH_S, evalArgs_ctx_names : forall FE EE A V EE' O Ctx N, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> AN : argsNames Ctx A N -> Ev : evalArgs FE EE A V EE' O -> ctx_names EE' Ctx on Ev as IH_A, evalRecFields_ctx_names : forall FE EE RF V EE' O Ctx N, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> RFN : recFieldNames Ctx RF N -> Ev : evalRecFields FE EE RF V EE' O -> ctx_names EE' Ctx on Ev as IH_RF. Subgoal 1.1: Variables: FE EE' Ctx N I IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (num I) N Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 1.2: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (plus E1 E2) N Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.2: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (plus E1 E2) N Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.2: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.2: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.2: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.3: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (minus E1 E2) N Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.3: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (minus E1 E2) N Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.3: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.3: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.3: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.4: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (mult E1 E2) N Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.4: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (mult E1 E2) N Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.4: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.4: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.4: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.5: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (div E1 E2) N Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.5: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (div E1 E2) N Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.5: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.5: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.5: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.6: Variables: FE EE' Ctx N IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx true N Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 1.7: Variables: FE EE' Ctx N IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx false N Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 1.8: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (and E1 E2) N Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.8: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (and E1 E2) N Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.8: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.8: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.8: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.9: Variables: FE EE EE' O Ctx N E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (and E1 E2) N Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.9: Variables: FE EE EE' O Ctx N E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (and E1 E2) N Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.9: Variables: FE EE EE' O Ctx N E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.9: Variables: FE EE EE' O Ctx N E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N H3 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.10: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (and E1 E2) N Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.10: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (and E1 E2) N Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.10: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.10: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.10: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.11: Variables: FE EE EE' O Ctx N E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (or E1 E2) N Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.11: Variables: FE EE EE' O Ctx N E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (or E1 E2) N Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.11: Variables: FE EE EE' O Ctx N E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.11: Variables: FE EE EE' O Ctx N E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N H3 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.12: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (or E1 E2) N Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.12: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (or E1 E2) N Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.12: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.12: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.12: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.13: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (or E1 E2) N Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.13: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (or E1 E2) N Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.13: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.13: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.13: Variables: FE EE EE' O Ctx N EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.14: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (not E1) N Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.14: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (not E1) N Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.14: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.14: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 EN : exprNames Ctx E1 N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.15: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (not E1) N Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.15: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (not E1) N Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.15: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.15: Variables: FE EE EE' O Ctx N E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 EN : exprNames Ctx E1 N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.16: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (greater E1 E2) N Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.16: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (greater E1 E2) N Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.16: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.16: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.16: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.17: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (greater E1 E2) N Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.17: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (greater E1 E2) N Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.17: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.17: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.17: Variables: FE EE EE' O Ctx N I1 EE3 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.18: Variables: FE EE EE' O Ctx N V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (eq E1 E2) N Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.18: Variables: FE EE EE' O Ctx N V1 EE3 O2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (eq E1 E2) N Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.18: Variables: FE EE EE' O Ctx N V1 EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.18: Variables: FE EE EE' O Ctx N V1 EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O Ctx N V1 EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.18: Variables: FE EE EE' O Ctx N V1 EE3 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.19: Variables: FE EE EE' O Ctx N V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (eq E1 E2) N Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.19: Variables: FE EE EE' O Ctx N V1 EE3 O2 V2 O3 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (eq E1 E2) N Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.19: Variables: FE EE EE' O Ctx N V1 EE3 O2 V2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.19: Variables: FE EE EE' O Ctx N V1 EE3 O2 V2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O Ctx N V1 EE3 O2 V2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.19: Variables: FE EE EE' O Ctx N V1 EE3 O2 V2 O3 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.20: Variables: FE EE' Ctx N S IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (stringLit S) N Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 1.21: Variables: FE EE EE' O Ctx N S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (appString E1 E2) N Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.21: Variables: FE EE EE' O Ctx N S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (appString E1 E2) N Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.21: Variables: FE EE EE' O Ctx N S1 EE3 O2 S2 O3 S E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.21: Variables: FE EE EE' O Ctx N S1 EE3 O2 S2 O3 S E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O Ctx N S1 EE3 O2 S2 O3 S E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.21: Variables: FE EE EE' O Ctx N S1 EE3 O2 S2 O3 S E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N Ctxs' : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.22: Variables: FE V EE' Ctx N X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (name X) N Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V ============================ ctx_names EE' Ctx
< search. Subgoal 1.23: Variables: FE EE V EE' O Ctx N RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (call Fun Args) N Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.23: Variables: FE EE V EE' O Ctx N RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (call Fun Args) N Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.23: Variables: FE EE V EE' O Ctx N RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args EN : argsNames Ctx Args N ============================ ctx_names EE' Ctx
< apply IH_A to _ _ _ _ Ctxs EN Ev2. Subgoal 1.23: Variables: FE EE V EE' O Ctx N RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args EN : argsNames Ctx Args N H3 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (stmtExpr S E1) N Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (stmtExpr S E1) N Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = N ============================ ctx_names EE' Ctx
< Ctxs': apply ctx_names_add_scope to Ctxs. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) ============================ ctx_names EE' Ctx
< Ctxs'': apply IH_S to _ _ _ _ Ctxs' EN Ev1. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) Ctxs'' : ctx_names EE3 CtxS ============================ ctx_names EE' Ctx
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) Ctxs'' : ctx_names EE3 CtxS H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply stmtNames_isCtx to _ _ EN. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) Ctxs'' : ctx_names EE3 CtxS H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list is_string) CtxS ============================ ctx_names EE' Ctx
< C: apply IH_E to _ _ _ _ Ctxs'' EN1 Ev2. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) Ctxs'' : ctx_names EE3 CtxS H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list is_string) CtxS C : ctx_names (Scope::EE') CtxS ============================ ctx_names EE' Ctx
< C: case C. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS NE BRest B IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS (B::BRest) EN1 : exprNames (B::BRest) E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) Ctxs'' : ctx_names EE3 (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list is_string) (B::BRest) C : forall K I, mem (K, I) Scope -> mem K B C1 : forall K, mem K B -> exists I, mem (K, I) Scope C2 : ctx_names EE' BRest ============================ ctx_names EE' Ctx
< apply stmtNames_keep_older to _ _ EN. Subgoal 1.24: Variables: FE EE V EE' O Ctx N EE3 O2 Scope O3 E1 S NS NE Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS (Scope'::Ctx) EN1 : exprNames (Scope'::Ctx) E1 NE EN2 : NS ++ NE = N Ctxs' : ctx_names ([]::EE) ([]::Ctx) Ctxs'' : ctx_names EE3 (Scope'::Ctx) H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list is_string) (Scope'::Ctx) C : forall K I, mem (K, I) Scope -> mem K Scope' C1 : forall K, mem K Scope' -> exists I, mem (K, I) Scope C2 : ctx_names EE' Ctx H5 : forall X, mem X [] -> mem X Scope' ============================ ctx_names EE' Ctx
< search. Subgoal 1.25: Variables: FE EE EE' O Ctx N VF RF IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (recBuild RF) N Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.25: Variables: FE EE EE' O Ctx N VF RF IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (recBuild RF) N Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.25: Variables: FE EE EE' O Ctx N VF RF IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF EN : recFieldNames Ctx RF N ============================ ctx_names EE' Ctx
< apply IH_RF to _ _ _ _ Ctxs EN Ev1. Subgoal 1.25: Variables: FE EE EE' O Ctx N VF RF IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF EN : recFieldNames Ctx RF N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.26: Variables: FE EE V EE' O Ctx N Fields F Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (recFieldAccess Rec F) N Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.26: Variables: FE EE V EE' O Ctx N Fields F Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (recFieldAccess Rec F) N Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.26: Variables: FE EE V EE' O Ctx N Fields F Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F EN : exprNames Ctx Rec N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.26: Variables: FE EE V EE' O Ctx N Fields F Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F EN : exprNames Ctx Rec N H3 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 2.1: Variables: FE EE' Ctx Ctx' N IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx SN : stmtNames Ctx noop N Ctx' Ev : evalStmt FE EE' noop EE' [] @ ============================ ctx_names EE' Ctx'
< case SN. Subgoal 2.1: Variables: FE EE' Ctx' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE' Ctx' Ev : evalStmt FE EE' noop EE' [] @ ============================ ctx_names EE' Ctx'
< search. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (seq S1 S2) N Ctx' Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx'
< apply stmtNames_isCtx to _ _ SN. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N H3 : is_list (is_list is_string) Ctx3 ============================ ctx_names EE' Ctx'
< apply stmtNames_isCtx to _ _ SN1. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N H3 : is_list (is_list is_string) Ctx3 H4 : is_list (is_list is_string) Ctx' ============================ ctx_names EE' Ctx'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N H3 : is_list (is_list is_string) Ctx3 H4 : is_list (is_list is_string) Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N H3 : is_list (is_list is_string) Ctx3 H4 : is_list (is_list is_string) Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) EE' ============================ ctx_names EE' Ctx'
< apply IH_S to _ _ _ _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N H3 : is_list (is_list is_string) Ctx3 H4 : is_list (is_list is_string) Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) EE' H7 : ctx_names EE3 Ctx3 ============================ ctx_names EE' Ctx'
< apply IH_S to _ _ _ _ _ _ Ev2. Subgoal 2.2: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = N H3 : is_list (is_list is_string) Ctx3 H4 : is_list (is_list is_string) Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) EE' H7 : ctx_names EE3 Ctx3 H8 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.3: Variables: FE EE O Ctx Ctx' N EE2 Scope V X E Ty IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (declare Ty X E) N Ctx' Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ ctx_names (((X, V)::Scope)::EE2) Ctx'
< case IsS. Subgoal 2.3: Variables: FE EE O Ctx Ctx' N EE2 Scope V X E Ty IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (declare Ty X E) N Ctx' Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ ctx_names (((X, V)::Scope)::EE2) Ctx'
< SN: case SN. Subgoal 2.3: Variables: FE EE O N EE2 Scope V X E Ty Ctx1 Scope1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) (Scope1::Ctx1) Ctxs : ctx_names EE (Scope1::Ctx1) Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SN : exprNames (Scope1::Ctx1) E N ============================ ctx_names (((X, V)::Scope)::EE2) ((X::Scope1)::Ctx1)
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.3: Variables: FE EE O N EE2 Scope V X E Ty Ctx1 Scope1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) (Scope1::Ctx1) Ctxs : ctx_names EE (Scope1::Ctx1) Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SN : exprNames (Scope1::Ctx1) E N H4 : ctx_names (Scope::EE2) (Scope1::Ctx1) ============================ ctx_names (((X, V)::Scope)::EE2) ((X::Scope1)::Ctx1)
< backchain ctx_names_add. Subgoal 2.4: Variables: FE EE EE' O Ctx Ctx' N V EE3 E X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assign X E) N Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.4: Variables: FE EE EE' O Ctx Ctx' N V EE3 E X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assign X E) N Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.4.1: Variables: FE EE EE' O Ctx' N V EE3 E X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E N ============================ ctx_names EE' Ctx'
< CN: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.4.1: Variables: FE EE EE' O Ctx' N V EE3 E X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E N CN : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.4.1: Variables: FE EE EE' O Ctx' N V EE3 E X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E N CN : ctx_names EE3 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply ctx_names_replaceScopes to _ _ CN Ev2. Subgoal 2.4.1: Variables: FE EE EE' O Ctx' N V EE3 E X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E N CN : ctx_names EE3 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.4.2: Variables: FE EE EE' O Ctx' V EE3 E X N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : not_mems X Ctx' SN1 : exprNames Ctx' E N1 ============================ ctx_names EE' Ctx'
< CN: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.4.2: Variables: FE EE EE' O Ctx' V EE3 E X N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : not_mems X Ctx' SN1 : exprNames Ctx' E N1 CN : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.4.2: Variables: FE EE EE' O Ctx' V EE3 E X N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : not_mems X Ctx' SN1 : exprNames Ctx' E N1 CN : ctx_names EE3 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply ctx_names_replaceScopes to _ _ CN Ev2. Subgoal 2.4.2: Variables: FE EE EE' O Ctx' V EE3 E X N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E SN : not_mems X Ctx' SN1 : exprNames Ctx' E N1 CN : ctx_names EE3 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.5: Variables: FE EE EE' O Ctx Ctx' N V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (recUpdate Rec Fields E) N Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.5: Variables: FE EE EE' O Ctx Ctx' N V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (recUpdate Rec Fields E) N Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.5.1: Variables: FE EE EE' O Ctx' N V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E N ============================ ctx_names EE' Ctx'
< CN: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.5.1: Variables: FE EE EE' O Ctx' N V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E N CN : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.5.1: Variables: FE EE EE' O Ctx' N V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E N CN : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply ctx_names_replaceScopes to _ _ CN Ev4. Subgoal 2.5.1: Variables: FE EE EE' O Ctx' N V EE3 FieldVals NewVals E Fields Rec IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E N CN : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.5.2: Variables: FE EE EE' O Ctx' V EE3 FieldVals NewVals E Fields Rec N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : not_mems Rec Ctx' SN1 : exprNames Ctx' E N1 ============================ ctx_names EE' Ctx'
< CN: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.5.2: Variables: FE EE EE' O Ctx' V EE3 FieldVals NewVals E Fields Rec N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : not_mems Rec Ctx' SN1 : exprNames Ctx' E N1 CN : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.5.2: Variables: FE EE EE' O Ctx' V EE3 FieldVals NewVals E Fields Rec N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : not_mems Rec Ctx' SN1 : exprNames Ctx' E N1 CN : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply ctx_names_replaceScopes to _ _ CN Ev4. Subgoal 2.5.2: Variables: FE EE EE' O Ctx' V EE3 FieldVals NewVals E Fields Rec N1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : not_mems Rec Ctx' SN1 : exprNames Ctx' E N1 CN : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.6: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) N Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.6: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) N Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N ============================ ctx_names EE' Ctx'
< C: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply ctx_names_add_scope to C. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') ============================ ctx_names EE' Ctx'
< C': apply IH_S to _ _ _ _ _ _ Ev2. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') C' : ctx_names (Scope::EE') CtxT ============================ ctx_names EE' Ctx'
< apply stmtNames_keep_older to _ _ SN1. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN FN CtxF N2 Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN (Scope'::Ctx') SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') C' : ctx_names (Scope::EE') (Scope'::Ctx') H6 : forall X, mem X [] -> mem X Scope' ============================ ctx_names EE' Ctx'
< case C'. Subgoal 2.6: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN FN CtxF N2 Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN (Scope'::Ctx') SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) Scope -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H9 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.7: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) N Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.7: Variables: FE EE EE' O Ctx Ctx' N EE3 O2 Scope O3 El Th Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) N Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N ============================ ctx_names EE' Ctx'
< C: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply ctx_names_add_scope to C. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') ============================ ctx_names EE' Ctx'
< C': apply IH_S to _ _ _ _ _ _ Ev2. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') C' : ctx_names (Scope::EE') CtxF ============================ ctx_names EE' Ctx'
< apply stmtNames_keep_older to _ _ SN2. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN N2 Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN (Scope'::Ctx') SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') C' : ctx_names (Scope::EE') (Scope'::Ctx') H6 : forall X, mem X [] -> mem X Scope' ============================ ctx_names EE' Ctx'
< case C'. Subgoal 2.7: Variables: FE EE EE' O Ctx' N EE3 O2 Scope O3 El Th Cond CN TN CtxT FN N2 Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN (Scope'::Ctx') SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = N C : ctx_names EE3 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names ([]::EE3) ([]::Ctx') H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) Scope -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H9 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.8: Variables: FE EE EE' O Ctx Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.8: Variables: FE EE EE' O Ctx Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ ctx_names EE' Ctx'
< SN: case SN (keep). Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN CtxB SN3 : CN ++ BN = N ============================ ctx_names EE' Ctx'
< C: apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN CtxB SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN CtxB SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ ctx_names EE' Ctx'
< apply ctx_names_add_scope to C. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN CtxB SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') ============================ ctx_names EE' Ctx'
< C': apply IH_S to _ _ _ _ _ _ Ev2. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN CtxB SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') C' : ctx_names (Scope::EE4) CtxB ============================ ctx_names EE' Ctx'
< apply stmtNames_keep_older to _ _ SN2. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN (Scope'::Ctx') SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') C' : ctx_names (Scope::EE4) (Scope'::Ctx') H5 : forall X, mem X [] -> mem X Scope' ============================ ctx_names EE' Ctx'
< case C'. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN (Scope'::Ctx') SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') H5 : forall X, mem X [] -> mem X Scope' H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE4 Ctx' ============================ ctx_names EE' Ctx'
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN (Scope'::Ctx') SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') H5 : forall X, mem X [] -> mem X Scope' H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE4 Ctx' IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ ctx_names EE' Ctx'
< case IsEE4+. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN (Scope'::Ctx') SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') H5 : forall X, mem X [] -> mem X Scope' H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE4 Ctx' H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ ctx_names EE' Ctx'
< apply IH_S to _ _ _ _ _ _ Ev3. Subgoal 2.8: Variables: FE EE EE' O Ctx' N EE2 O2 Scope EE4 O3 O4 O12 Body Cond CN BN Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' SN : stmtNames Ctx' (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN1 : exprNames Ctx' Cond CN SN2 : stmtNames ([]::Ctx') Body BN (Scope'::Ctx') SN3 : CN ++ BN = N C : ctx_names EE2 Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : ctx_names ([]::EE2) ([]::Ctx') H5 : forall X, mem X [] -> mem X Scope' H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE4 Ctx' H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE4 H11 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.9: Variables: FE EE EE' O Ctx Ctx' N Body Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.9: Variables: FE EE EE' O Ctx Ctx' N Body Cond IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (while Cond Body) N Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.9: Variables: FE EE EE' O Ctx' N Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Body BN CtxB SN2 : CN ++ BN = N ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.9: Variables: FE EE EE' O Ctx' N Body Cond CN BN CtxB IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Body BN CtxB SN2 : CN ++ BN = N H3 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.10: Variables: FE EE EE' O Ctx Ctx' N Scope S1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (scopeStmt S1) N Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.10: Variables: FE EE EE' O Ctx Ctx' N Scope S1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (scopeStmt S1) N Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.10: Variables: FE EE EE' O Ctx' N Scope S1 Ctx2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 N Ctx2 ============================ ctx_names EE' Ctx'
< apply ctx_names_add_scope to Ctxs. Subgoal 2.10: Variables: FE EE EE' O Ctx' N Scope S1 Ctx2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 N Ctx2 H2 : ctx_names ([]::EE) ([]::Ctx') ============================ ctx_names EE' Ctx'
< C: apply IH_S to _ _ _ _ _ _ Ev1. Subgoal 2.10: Variables: FE EE EE' O Ctx' N Scope S1 Ctx2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 N Ctx2 H2 : ctx_names ([]::EE) ([]::Ctx') C : ctx_names (Scope::EE') Ctx2 ============================ ctx_names EE' Ctx'
< case C. Subgoal 2.10: Variables: FE EE EE' O Ctx' N Scope S1 BRest B IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 N (B::BRest) H2 : ctx_names ([]::EE) ([]::Ctx') H3 : forall K I, mem (K, I) Scope -> mem K B H4 : forall K, mem K B -> exists I, mem (K, I) Scope H5 : ctx_names EE' BRest ============================ ctx_names EE' Ctx'
< apply stmtNames_keep_older to _ _ SN. Subgoal 2.10: Variables: FE EE EE' O Ctx' N Scope S1 Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 N (Scope'::Ctx') H2 : ctx_names ([]::EE) ([]::Ctx') H3 : forall K I, mem (K, I) Scope -> mem K Scope' H4 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H5 : ctx_names EE' Ctx' H6 : forall X, mem X [] -> mem X Scope' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.11: Variables: FE EE EE' O Ctx Ctx' N I O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.11: Variables: FE EE EE' O Ctx Ctx' N I O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.11: Variables: FE EE EE' O Ctx' N I O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E SN : exprNames Ctx' E N ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.11: Variables: FE EE EE' O Ctx' N I O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E SN : exprNames Ctx' E N H2 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.12: Variables: FE EE EE' O Ctx Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.12: Variables: FE EE EE' O Ctx Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.12: Variables: FE EE EE' O Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E SN : exprNames Ctx' E N ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.12: Variables: FE EE EE' O Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E SN : exprNames Ctx' E N H2 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.13: Variables: FE EE EE' O Ctx Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.13: Variables: FE EE EE' O Ctx Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.13: Variables: FE EE EE' O Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E SN : exprNames Ctx' E N ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.13: Variables: FE EE EE' O Ctx' N O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E SN : exprNames Ctx' E N H2 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.14: Variables: FE EE EE' O Ctx Ctx' N S1 O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.14: Variables: FE EE EE' O Ctx Ctx' N S1 O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (printVal E) N Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.14: Variables: FE EE EE' O Ctx' N S1 O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E SN : exprNames Ctx' E N ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.14: Variables: FE EE EE' O Ctx' N S1 O2 E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E SN : exprNames Ctx' E N H2 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 3.1: Variables: FE EE' Ctx N IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx AN : argsNames Ctx nilArgs N Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 3.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx AN : argsNames Ctx (consArgs E Rest) N Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsA. Subgoal 3.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 Rest E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx AN : argsNames Ctx (consArgs E Rest) N Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ ctx_names EE' Ctx
< AN: case AN. Subgoal 3.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 Rest E EN AN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E EN AN1 : argsNames Ctx Rest AN AN2 : EN ++ AN = N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 Rest E EN AN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E EN AN1 : argsNames Ctx Rest AN AN2 : EN ++ AN = N H3 : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 Rest E EN AN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E EN AN1 : argsNames Ctx Rest AN AN2 : EN ++ AN = N H3 : ctx_names EE3 Ctx H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_A to _ _ _ _ _ _ Ev2. Subgoal 3.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 Rest E EN AN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E EN AN1 : argsNames Ctx Rest AN AN2 : EN ++ AN = N H3 : ctx_names EE3 Ctx H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 4.1: Variables: FE EE' Ctx N IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx RFN : recFieldNames Ctx nilRecFieldExprs N Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 4.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E Rest) N Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsRF. Subgoal 4.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 F Rest E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E Rest) N Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ ctx_names EE' Ctx
< case RFN. Subgoal 4.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 F Rest E EN RN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : exprNames Ctx E EN H5 : recFieldNames Ctx Rest RN H6 : EN ++ RN = N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 F Rest E EN RN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : exprNames Ctx E EN H5 : recFieldNames Ctx Rest RN H6 : EN ++ RN = N H7 : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 F Rest E EN RN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : exprNames Ctx E EN H5 : recFieldNames Ctx Rest RN H6 : EN ++ RN = N H7 : ctx_names EE3 Ctx H8 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_RF to _ _ _ _ _ _ Ev2. Subgoal 4.2: Variables: FE EE EE' O Ctx N EE3 O2 O3 VRest V1 F Rest E EN RN IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : exprNames Ctx E EN H5 : recFieldNames Ctx Rest RN H6 : EN ++ RN = N H7 : ctx_names EE3 Ctx H8 : is_list (is_list (is_pair is_string is_value)) EE3 H9 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Proof completed.
< Theorem ctx_names_names [K, I] : forall (A : list (list (pair K I))) Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx -> mem X Names. ============================ forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx -> mem X Names
< induction on 3. IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names ============================ forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx @ -> mem X Names
< intros CN N M. Variables: A Names Ctx X IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names CN : ctx_names A Ctx N : names A Names M : mems X Ctx @ ============================ mem X Names
< M: case M (keep). Subgoal 1: Variables: A Names X Rest S IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names CN : ctx_names A (S::Rest) N : names A Names M : mems X (S::Rest) @ M1 : mem X S ============================ mem X Names
< CN: case CN. Subgoal 1: Variables: Names X Rest S ARest A1 IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names N : names (A1::ARest) Names M : mems X (S::Rest) @ M1 : mem X S CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest ============================ mem X Names
< N: case N. Subgoal 1: Variables: Names X Rest S ARest A1 NScope NRest IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mem X S CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names ============================ mem X Names
< M': apply CN1 to M1. Subgoal 1: Variables: Names X Rest S ARest A1 NScope NRest I IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mem X S CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names M' : mem (X, I) A1 ============================ mem X Names
< MN: apply domain_mem to M' N. Subgoal 1: Variables: Names X Rest S ARest A1 NScope NRest I IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mem X S CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names M' : mem (X, I) A1 MN : mem X NScope ============================ mem X Names
< apply mem_append_left to MN N2. Subgoal 1: Variables: Names X Rest S ARest A1 NScope NRest I IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mem X S CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names M' : mem (X, I) A1 MN : mem X NScope H1 : mem X Names ============================ mem X Names
< search. Subgoal 2: Variables: A Names X Rest S IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names CN : ctx_names A (S::Rest) N : names A Names M : mems X (S::Rest) @ M1 : mems X Rest * ============================ mem X Names
< CN: case CN. Subgoal 2: Variables: Names X Rest S ARest A1 IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names N : names (A1::ARest) Names M : mems X (S::Rest) @ M1 : mems X Rest * CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest ============================ mem X Names
< N: case N. Subgoal 2: Variables: Names X Rest S ARest A1 NScope NRest IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mems X Rest * CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names ============================ mem X Names
< MN: apply IH to CN2 N1 M1. Subgoal 2: Variables: Names X Rest S ARest A1 NScope NRest IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mems X Rest * CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names MN : mem X NRest ============================ mem X Names
< apply mem_append_right to MN N2. Subgoal 2: Variables: Names X Rest S ARest A1 NScope NRest IH : forall A Names Ctx X, ctx_names A Ctx -> names A Names -> mems X Ctx * -> mem X Names M : mems X (S::Rest) @ M1 : mems X Rest * CN : forall K I, mem (K, I) A1 -> mem K S CN1 : forall K, mem K S -> exists I, mem (K, I) A1 CN2 : ctx_names ARest Rest N : domain A1 NScope N1 : names ARest NRest N2 : NScope ++ NRest = Names MN : mem X NRest H1 : mem X Names ============================ mem X Names
< search. Proof completed.
< Theorem newNameScopes_ctx_names_lookupScopes [V] : forall N Len A B Ctx X (V : V), newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V -> lookupScopes X B V. ============================ forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V -> lookupScopes X B V
< induction on 4. IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V ============================ forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V @ -> lookupScopes X B V
< intros NNS CN M L. Variables: N Len A B Ctx X V IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V NNS : newNameScopes N Len A B CN : ctx_names B Ctx M : mems X Ctx L : lookupScopes X A V @ ============================ lookupScopes X B V
< L: case L. Subgoal 1: Variables: N Len B Ctx X V Rest L IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V NNS : newNameScopes N Len (L::Rest) B CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V ============================ lookupScopes X B V
< NNS: case NNS. Subgoal 1.1: Variables: N Len B Ctx X V Rest L N1 SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS1 : drop N1 (L::Rest) B NNS2 : take N1 (L::Rest) N NNS3 : names N SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ lookupScopes X B V
< Drop: case NNS1. Subgoal 1.1.1: Variables: N Len Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names (L::Rest) Ctx M : mems X Ctx L : lookup L X V NNS : length (L::Rest) Len NNS2 : take 0 (L::Rest) N NNS3 : names N SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ lookupScopes X (L::Rest) V
< search. Subgoal 1.1.2: Variables: N Len B Ctx X V Rest L N1 SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS2 : take N1 (L::Rest) N NNS3 : names N SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B ============================ lookupScopes X B V
< MBN: apply ctx_names_names to CN NNS4 M. Subgoal 1.1.2: Variables: N Len B Ctx X V Rest L N1 SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS2 : take N1 (L::Rest) N NNS3 : names N SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B MBN : mem X BNames ============================ lookupScopes X B V
< Take: case NNS2. Subgoal 1.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B MBN : mem X BNames ============================ lookupScopes X B V
< P: assert 1 + -1 = 0. Subgoal 1.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B MBN : mem X BNames P : 1 + -1 = 0 ============================ lookupScopes X B V
< apply drop_is_integer to Drop1. Subgoal 1.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer N2 ============================ lookupScopes X B V
< apply plus_integer_unique_addend to _ _ _ P Drop. Subgoal 1.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer -1 ============================ lookupScopes X B V
< GEq: apply drop_geq_0 to Drop1. Subgoal 1.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer -1 GEq : -1 >= 0 ============================ lookupScopes X B V
< LEq: case GEq. Subgoal 1.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer -1 LEq : 0 <= -1 ============================ lookupScopes X B V
< case LEq. Subgoal 1.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N3 = N1 Take1 : take N3 Rest F ============================ lookupScopes X B V
< Names: case NNS3. Subgoal 1.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N3 = N1 Take1 : take N3 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames ============================ lookupScopes X B V
< ML: apply lookup_mem to L. Subgoal 1.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N3 = N1 Take1 : take N3 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames ML : mem (X, V) L ============================ lookupScopes X B V
< MNS: apply domain_mem to ML Names. Subgoal 1.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N3 = N1 Take1 : take N3 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames ML : mem (X, V) L MNS : mem X NScope ============================ lookupScopes X B V
< MSNames: apply mem_append_left to MNS Names2. Subgoal 1.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : lookup L X V NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N3 = N1 Take1 : take N3 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames ML : mem (X, V) L MNS : mem X NScope MSNames : mem X SNames ============================ lookupScopes X B V
< apply NNS5 to MSNames MBN. Subgoal 1.2: Variables: N Len Ctx X V Rest L BR IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names (L::BR) Ctx M : mems X Ctx L : lookup L X V NNS : newNameScopes N Len Rest BR ============================ lookupScopes X (L::BR) V
< search. Subgoal 2: Variables: N Len B Ctx X V Rest L IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V NNS : newNameScopes N Len (L::Rest) B CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * ============================ lookupScopes X B V
< NNS: case NNS. Subgoal 2.1: Variables: N Len B Ctx X V Rest L N1 SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS1 : drop N1 (L::Rest) B NNS2 : take N1 (L::Rest) N NNS3 : names N SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ lookupScopes X B V
< Drop: case NNS1. Subgoal 2.1.1: Variables: N Len Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names (L::Rest) Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length (L::Rest) Len NNS2 : take 0 (L::Rest) N NNS3 : names N SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ lookupScopes X (L::Rest) V
< search. Subgoal 2.1.2: Variables: N Len B Ctx X V Rest L N1 SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS2 : take N1 (L::Rest) N NNS3 : names N SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B ============================ lookupScopes X B V
< Take: case NNS2. Subgoal 2.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B ============================ lookupScopes X B V
< P: assert 1 + -1 = 0. Subgoal 2.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B P : 1 + -1 = 0 ============================ lookupScopes X B V
< apply drop_is_integer to Drop1. Subgoal 2.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames N2 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B P : 1 + -1 = 0 H1 : is_integer N2 ============================ lookupScopes X B V
< apply plus_integer_unique_addend to _ _ _ P Drop. Subgoal 2.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B P : 1 + -1 = 0 H1 : is_integer -1 ============================ lookupScopes X B V
< GEq: apply drop_geq_0 to Drop1. Subgoal 2.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B P : 1 + -1 = 0 H1 : is_integer -1 GEq : -1 >= 0 ============================ lookupScopes X B V
< LEq: case GEq. Subgoal 2.1.2.1: Variables: Len B Ctx X V Rest L SNames BNames IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B P : 1 + -1 = 0 H1 : is_integer -1 LEq : 0 <= -1 ============================ lookupScopes X B V
< case LEq. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F ============================ lookupScopes X B V
< apply drop_is_integer to Drop1. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N2 ============================ lookupScopes X B V
< apply take_is_integer to Take1. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N2 N3 F IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N1 Drop1 : drop N2 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N2 H2 : is_integer N3 ============================ lookupScopes X B V
< apply plus_integer_unique_addend to _ _ _ Drop Take. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 ============================ lookupScopes X B V
< SNames: case NNS3. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ lookupScopes X B V
< NNS': assert newNameScopes F Len Rest B. Subgoal 2.1.2.2.1: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ newNameScopes F Len Rest B
< unfold . Subgoal 2.1.2.2.1: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ exists N SNames BNames, ((((length B Len /\ drop N Rest B) /\ take N Rest F) /\ names F SNames) /\ names B BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists N3, NRest, BNames. Subgoal 2.1.2.2.1: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ ((((length B Len /\ drop N3 Rest B) /\ take N3 Rest F) /\ names F NRest) /\ names B BNames) /\ (forall X, mem X NRest -> mem X BNames -> false)
< split. Subgoal 2.1.2.2.1.1: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ length B Len
< search. Subgoal 2.1.2.2.1.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ drop N3 Rest B
< search. Subgoal 2.1.2.2.1.3: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ take N3 Rest F
< search. Subgoal 2.1.2.2.1.4: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ names F NRest
< search. Subgoal 2.1.2.2.1.5: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ names B BNames
< search. Subgoal 2.1.2.2.1.6: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames ============================ forall X, mem X NRest -> mem X BNames -> false
< intros MNR MB. Subgoal 2.1.2.2.1.6: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest X1 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames MNR : mem X1 NRest MB : mem X1 BNames ============================ false
< apply mem_append_right to MNR SNames2. Subgoal 2.1.2.2.1.6: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest X1 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames MNR : mem X1 NRest MB : mem X1 BNames H3 : mem X1 SNames ============================ false
< backchain NNS5. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames NNS' : newNameScopes F Len Rest B ============================ lookupScopes X B V
< apply IH to NNS' CN M L1. Subgoal 2.1.2.2: Variables: Len B Ctx X V Rest L N1 SNames BNames N3 F NScope NRest IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names B Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N3 = N1 Drop1 : drop N3 Rest B Take : 1 + N3 = N1 Take1 : take N3 Rest F H1 : is_integer N3 H2 : is_integer N3 SNames : domain L NScope SNames1 : names F NRest SNames2 : NScope ++ NRest = SNames NNS' : newNameScopes F Len Rest B H3 : lookupScopes X B V ============================ lookupScopes X B V
< search. Subgoal 2.2: Variables: N Len Ctx X V Rest L BR IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V CN : ctx_names (L::BR) Ctx M : mems X Ctx L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len Rest BR ============================ lookupScopes X (L::BR) V
< CN: case CN. Subgoal 2.2: Variables: N Len X V Rest L BR BRest B1 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V M : mems X (B1::BRest) L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len Rest BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest ============================ lookupScopes X (L::BR) V
< M: case M. Subgoal 2.2.1: Variables: N Len X V Rest L BR BRest B1 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len Rest BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mem X B1 ============================ lookupScopes X (L::BR) V
< MB: apply CN1 to M. Subgoal 2.2.1: Variables: N Len X V Rest L BR BRest B1 I IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len Rest BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mem X B1 MB : mem (X, I) L ============================ lookupScopes X (L::BR) V
< apply no_lookup_mem to L MB. Subgoal 2.2.2: Variables: N Len X V Rest L BR BRest B1 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len Rest BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mems X BRest ============================ lookupScopes X (L::BR) V
< apply IH to NNS CN2 M L1. Subgoal 2.2.2: Variables: N Len X V Rest L BR BRest B1 IH : forall N Len A B Ctx X V, newNameScopes N Len A B -> ctx_names B Ctx -> mems X Ctx -> lookupScopes X A V * -> lookupScopes X B V L : no_lookup L X L1 : lookupScopes X Rest V * NNS : newNameScopes N Len Rest BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mems X BRest H1 : lookupScopes X BR V ============================ lookupScopes X (L::BR) V
< search. Proof completed.
< Theorem newNameScopes_replaceScopes_back : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA -> exists RB, replaceScopes X V B RB. ============================ forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA -> exists RB, replaceScopes X V B RB
< induction on 8. IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB ============================ forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA @ -> exists RB, replaceScopes X V B RB
< intros IsA IsB IsX IsV CN M NNS R. Variables: S Len A B X V RA Ctx IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx NNS : newNameScopes S Len A B R : replaceScopes X V A RA @ ============================ exists RB, replaceScopes X V B RB
< R: case R. Subgoal 1: Variables: S Len B X V Ctx I Rest LRemain L IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx NNS : newNameScopes S Len (L::Rest) B R : mem (X, I) L R1 : remove_all L X LRemain ============================ exists RB, replaceScopes X V B RB
< NNS: case NNS. Subgoal 1.1: Variables: S Len B X V Ctx I Rest LRemain L N SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS1 : drop N (L::Rest) B NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists RB, replaceScopes X V B RB
< Drop: case NNS1. Subgoal 1.1.1: Variables: S Len X V Ctx I Rest LRemain L SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V CN : ctx_names (L::Rest) Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length (L::Rest) Len NNS2 : take 0 (L::Rest) S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists RB, replaceScopes X V (L::Rest) RB
< search. Subgoal 1.1.2: Variables: S Len B X V Ctx I Rest LRemain L N SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N Drop1 : drop N2 Rest B ============================ exists RB, replaceScopes X V B RB
< MBN: apply ctx_names_names to CN NNS4 M. Subgoal 1.1.2: Variables: S Len B X V Ctx I Rest LRemain L N SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N Drop1 : drop N2 Rest B MBN : mem X BNames ============================ exists RB, replaceScopes X V B RB
< Take: case NNS2. Subgoal 1.1.2.1: Variables: Len B X V Ctx I Rest LRemain L SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B MBN : mem X BNames ============================ exists RB, replaceScopes X V B RB
< P: assert 1 + -1 = 0. Subgoal 1.1.2.1: Variables: Len B X V Ctx I Rest LRemain L SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B MBN : mem X BNames P : 1 + -1 = 0 ============================ exists RB, replaceScopes X V B RB
< apply drop_is_integer to Drop1. Subgoal 1.1.2.1: Variables: Len B X V Ctx I Rest LRemain L SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer N2 ============================ exists RB, replaceScopes X V B RB
< apply plus_integer_unique_addend to _ _ _ P Drop. Subgoal 1.1.2.1: Variables: Len B X V Ctx I Rest LRemain L SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer -1 ============================ exists RB, replaceScopes X V B RB
< GEq: apply drop_geq_0 to Drop1. Subgoal 1.1.2.1: Variables: Len B X V Ctx I Rest LRemain L SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer -1 GEq : -1 >= 0 ============================ exists RB, replaceScopes X V B RB
< LEq: case GEq. Subgoal 1.1.2.1: Variables: Len B X V Ctx I Rest LRemain L SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B MBN : mem X BNames P : 1 + -1 = 0 H1 : is_integer -1 LEq : 0 <= -1 ============================ exists RB, replaceScopes X V B RB
< case LEq. Subgoal 1.1.2.2: Variables: Len B X V Ctx I Rest LRemain L N SNames BNames N2 N1 F IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N1 = N Take1 : take N1 Rest F ============================ exists RB, replaceScopes X V B RB
< Names: case NNS3. Subgoal 1.1.2.2: Variables: Len B X V Ctx I Rest LRemain L N SNames BNames N2 N1 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N1 = N Take1 : take N1 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames ============================ exists RB, replaceScopes X V B RB
< MNS: apply domain_mem to R Names. Subgoal 1.1.2.2: Variables: Len B X V Ctx I Rest LRemain L N SNames BNames N2 N1 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N1 = N Take1 : take N1 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames MNS : mem X NScope ============================ exists RB, replaceScopes X V B RB
< MSNames: apply mem_append_left to MNS Names2. Subgoal 1.1.2.2: Variables: Len B X V Ctx I Rest LRemain L N SNames BNames N2 N1 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false Drop : 1 + N2 = N Drop1 : drop N2 Rest B MBN : mem X BNames Take : 1 + N1 = N Take1 : take N1 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames MNS : mem X NScope MSNames : mem X SNames ============================ exists RB, replaceScopes X V B RB
< apply NNS5 to MSNames MBN. Subgoal 1.2: Variables: S Len X V Ctx I Rest LRemain L BR IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L::BR) IsX : is_string X IsV : is_value V CN : ctx_names (L::BR) Ctx M : mems X Ctx R : mem (X, I) L R1 : remove_all L X LRemain NNS : newNameScopes S Len Rest BR ============================ exists RB, replaceScopes X V (L::BR) RB
< search. Subgoal 2: Variables: S Len B X V Ctx New L Rest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx NNS : newNameScopes S Len (L::Rest) B R : no_lookup L X R1 : replaceScopes X V Rest New * ============================ exists RB, replaceScopes X V B RB
< NNS: case NNS. Subgoal 2.1: Variables: S Len B X V Ctx New L Rest N SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS1 : drop N (L::Rest) B NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists RB, replaceScopes X V B RB
< apply drop_is_integer to NNS1. Subgoal 2.1: Variables: S Len B X V Ctx New L Rest N SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS1 : drop N (L::Rest) B NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N ============================ exists RB, replaceScopes X V B RB
< Drop: case NNS1. Subgoal 2.1.1: Variables: S Len X V Ctx New L Rest SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X IsV : is_value V CN : ctx_names (L::Rest) Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length (L::Rest) Len NNS2 : take 0 (L::Rest) S NNS3 : names S SNames NNS4 : names (L::Rest) BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer 0 ============================ exists RB, replaceScopes X V (L::Rest) RB
< search. Subgoal 2.1.2: Variables: S Len B X V Ctx New L Rest N SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B ============================ exists RB, replaceScopes X V B RB
< apply drop_is_integer to Drop1. Subgoal 2.1.2: Variables: S Len B X V Ctx New L Rest N SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS2 : take N (L::Rest) S NNS3 : names S SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 ============================ exists RB, replaceScopes X V B RB
< Take: case NNS2. Subgoal 2.1.2.1: Variables: Len B X V Ctx New L Rest SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer 0 Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B H2 : is_integer N2 ============================ exists RB, replaceScopes X V B RB
< P: assert 1 + -1 = 0. Subgoal 2.1.2.1: Variables: Len B X V Ctx New L Rest SNames BNames N2 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer 0 Drop : 1 + N2 = 0 Drop1 : drop N2 Rest B H2 : is_integer N2 P : 1 + -1 = 0 ============================ exists RB, replaceScopes X V B RB
< apply plus_integer_unique_addend to _ _ _ P Drop. Subgoal 2.1.2.1: Variables: Len B X V Ctx New L Rest SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer 0 Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B H2 : is_integer -1 P : 1 + -1 = 0 ============================ exists RB, replaceScopes X V B RB
< GEq: apply drop_geq_0 to Drop1. Subgoal 2.1.2.1: Variables: Len B X V Ctx New L Rest SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer 0 Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B H2 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ exists RB, replaceScopes X V B RB
< LEq: case GEq. Subgoal 2.1.2.1: Variables: Len B X V Ctx New L Rest SNames BNames IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS3 : names [] SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer 0 Drop : 1 + -1 = 0 Drop1 : drop -1 Rest B H2 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ exists RB, replaceScopes X V B RB
< case LEq. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 N1 F IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS3 : names (L::F) SNames NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N1 = N Take1 : take N1 Rest F ============================ exists RB, replaceScopes X V B RB
< Names: case NNS3. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 N1 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N1 = N Take1 : take N1 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames ============================ exists RB, replaceScopes X V B RB
< apply take_is_integer to Take1. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 N1 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N1 = N Take1 : take N1 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N1 ============================ exists RB, replaceScopes X V B RB
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ exists RB, replaceScopes X V B RB
< NNS': assert newNameScopes F Len Rest B. Subgoal 2.1.2.2.1: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ newNameScopes F Len Rest B
< unfold . Subgoal 2.1.2.2.1: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ exists N SNames BNames, ((((length B Len /\ drop N Rest B) /\ take N Rest F) /\ names F SNames) /\ names B BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists N2, NRest, BNames. Subgoal 2.1.2.2.1: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ ((((length B Len /\ drop N2 Rest B) /\ take N2 Rest F) /\ names F NRest) /\ names B BNames) /\ (forall X, mem X NRest -> mem X BNames -> false)
< split. Subgoal 2.1.2.2.1.1: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ length B Len
< search. Subgoal 2.1.2.2.1.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ drop N2 Rest B
< search. Subgoal 2.1.2.2.1.3: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ take N2 Rest F
< search. Subgoal 2.1.2.2.1.4: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ names F NRest
< search. Subgoal 2.1.2.2.1.5: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ names B BNames
< search. Subgoal 2.1.2.2.1.6: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 ============================ forall X, mem X NRest -> mem X BNames -> false
< intros MN MB. Subgoal 2.1.2.2.1.6: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest X1 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 MN : mem X1 NRest MB : mem X1 BNames ============================ false
< S: apply mem_append_right to MN Names2. Subgoal 2.1.2.2.1.6: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest X1 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 MN : mem X1 NRest MB : mem X1 BNames S : mem X1 SNames ============================ false
< apply NNS5 to S MB. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 NNS' : newNameScopes F Len Rest B ============================ exists RB, replaceScopes X V B RB
< case IsA. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 NNS' : newNameScopes F Len Rest B H4 : is_list (is_pair is_string is_value) L H5 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists RB, replaceScopes X V B RB
< apply IH to _ _ _ _ CN M NNS' R1. Subgoal 2.1.2.2: Variables: Len B X V Ctx New L Rest N SNames BNames N2 F NScope NRest RB IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X IsV : is_value V CN : ctx_names B Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : length B Len NNS4 : names B BNames NNS5 : forall X, mem X SNames -> mem X BNames -> false H1 : is_integer N Drop : 1 + N2 = N Drop1 : drop N2 Rest B H2 : is_integer N2 Take : 1 + N2 = N Take1 : take N2 Rest F Names : domain L NScope Names1 : names F NRest Names2 : NScope ++ NRest = SNames H3 : is_integer N2 NNS' : newNameScopes F Len Rest B H4 : is_list (is_pair is_string is_value) L H5 : is_list (is_list (is_pair is_string is_value)) Rest H6 : replaceScopes X V B RB ============================ exists RB, replaceScopes X V B RB
< search. Subgoal 2.2: Variables: S Len X V Ctx New L Rest BR IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L::BR) IsX : is_string X IsV : is_value V CN : ctx_names (L::BR) Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR ============================ exists RB, replaceScopes X V (L::BR) RB
< case IsA. Subgoal 2.2: Variables: S Len X V Ctx New L Rest BR IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsB : is_list (is_list (is_pair is_string is_value)) (L::BR) IsX : is_string X IsV : is_value V CN : ctx_names (L::BR) Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists RB, replaceScopes X V (L::BR) RB
< case IsB. Subgoal 2.2: Variables: S Len X V Ctx New L Rest BR IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsX : is_string X IsV : is_value V CN : ctx_names (L::BR) Ctx M : mems X Ctx R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) BR ============================ exists RB, replaceScopes X V (L::BR) RB
< CN: case CN. Subgoal 2.2: Variables: S Len X V New L Rest BR BRest B1 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsX : is_string X IsV : is_value V M : mems X (B1::BRest) R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest ============================ exists RB, replaceScopes X V (L::BR) RB
< M: case M. Subgoal 2.2.1: Variables: S Len X V New L Rest BR BRest B1 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsX : is_string X IsV : is_value V R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mem X B1 ============================ exists RB, replaceScopes X V (L::BR) RB
< ML: apply CN1 to M. Subgoal 2.2.1: Variables: S Len X V New L Rest BR BRest B1 I IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsX : is_string X IsV : is_value V R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mem X B1 ML : mem (X, I) L ============================ exists RB, replaceScopes X V (L::BR) RB
< apply no_lookup_mem to R ML. Subgoal 2.2.2: Variables: S Len X V New L Rest BR BRest B1 IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsX : is_string X IsV : is_value V R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mems X BRest ============================ exists RB, replaceScopes X V (L::BR) RB
< apply IH to _ _ _ _ CN2 M NNS R1. Subgoal 2.2.2: Variables: S Len X V New L Rest BR BRest B1 RB IH : forall S Len A B X V RA Ctx, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> is_value V -> ctx_names B Ctx -> mems X Ctx -> newNameScopes S Len A B -> replaceScopes X V A RA * -> exists RB, replaceScopes X V B RB IsX : is_string X IsV : is_value V R : no_lookup L X R1 : replaceScopes X V Rest New * NNS : newNameScopes S Len Rest BR H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) BR CN : forall K I, mem (K, I) L -> mem K B1 CN1 : forall K, mem K B1 -> exists I, mem (K, I) L CN2 : ctx_names BR BRest M : mems X BRest H5 : replaceScopes X V BR RB ============================ exists RB, replaceScopes X V (L::BR) RB
< search. Proof completed.
< Extensible_Theorem evalExpr_newNameScopes_exists_back : forall FE EE_A EE_B E V Ctx EE_A' O N Len, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE_B Ctx -> EN : exprNames Ctx E [] -> EvA : evalExpr FE EE_A E V EE_A' O -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O on EvA as IH_E, evalStmt_newNameScopes_exists_back : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names (Scope::EE_B) Ctx -> SN : stmtNames Ctx S [] Ctx' -> EvA : evalStmt FE (Scope::EE_A) S EE_A' O -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O on EvA as IH_S, evalArgs_newNameScopes_exists_back : forall FE EE_A EE_B A V Ctx EE_A' O N Len, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE_B Ctx -> AN : argsNames Ctx A [] -> EvA : evalArgs FE EE_A A V EE_A' O -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O on EvA as IH_A, evalRecFields_newNameScopes_exists_back : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE_B Ctx -> RFN : recFieldNames Ctx RF [] -> EvA : evalRecFields FE EE_A RF V EE_A' O -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O on EvA as IH_RF. Subgoal 1.1: Variables: FE EE_B Ctx EE_A' N Len I IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (num I) [] EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalExpr FE EE_B (num I) (intVal I) EE_B' []
< search. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (plus E1 E2) [] EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (plus E1 E2) [] EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< EN: case EN. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< case EN2. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (minus E1 E2) [] EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (minus E1 E2) [] EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< EN: case EN. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< case EN2. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.3: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (mult E1 E2) [] EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (mult E1 E2) [] EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< EN: case EN. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< case EN2. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.4: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (div E1 E2) [] EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (div E1 E2) [] EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< EN: case EN. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< case EN2. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.5: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.6: Variables: FE EE_B Ctx EE_A' N Len IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx true [] EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalExpr FE EE_B true trueVal EE_B' []
< search. Subgoal 1.7: Variables: FE EE_B Ctx EE_A' N Len IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx false [] EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalExpr FE EE_B false falseVal EE_B' []
< search. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (and E1 E2) [] EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (and E1 E2) [] EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< EN: case EN. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< case EN2. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.8: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 trueVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< search. Subgoal 1.9: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (and E1 E2) [] EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.9: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (and E1 E2) [] EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< EN: case EN. Subgoal 1.9: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< case EN2. Subgoal 1.9: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA1 NNS. Subgoal 1.9: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] H3 : evalExpr FE EE_B E1 falseVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< search. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (and E1 E2) [] EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (and E1 E2) [] EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< EN: case EN. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< case EN2. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.10: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 falseVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< search. Subgoal 1.11: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (or E1 E2) [] EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.11: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (or E1 E2) [] EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< EN: case EN. Subgoal 1.11: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< case EN2. Subgoal 1.11: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA1 NNS. Subgoal 1.11: Variables: FE EE_A EE_B Ctx EE_A' O N Len E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] H3 : evalExpr FE EE_B E1 trueVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< search. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (or E1 E2) [] EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (or E1 E2) [] EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< EN: case EN. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< case EN2. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.12: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 trueVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< search. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (or E1 E2) [] EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (or E1 E2) [] EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< EN: case EN. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< case EN2. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.13: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 falseVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< search. Subgoal 1.14: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (not E1) [] EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< case IsE. Subgoal 1.14: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (not E1) [] EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< EN: case EN. Subgoal 1.14: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA1 NNS. Subgoal 1.14: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 EN : exprNames Ctx E1 [] H2 : evalExpr FE EE_B E1 falseVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< search. Subgoal 1.15: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (not E1) [] EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< case IsE. Subgoal 1.15: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (not E1) [] EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< EN: case EN. Subgoal 1.15: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA1 NNS. Subgoal 1.15: Variables: FE EE_A EE_B Ctx EE_A' O N Len E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 EN : exprNames Ctx E1 [] H2 : evalExpr FE EE_B E1 trueVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< search. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (greater E1 E2) [] EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (greater E1 E2) [] EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< EN: case EN. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< case EN2. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.16: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< search. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (greater E1 E2) [] EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (greater E1 E2) [] EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< EN: case EN. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< case EN2. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.17: Variables: FE EE_A EE_B Ctx EE_A' O N Len I1 EE1 O2 I2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< search. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (eq E1 E2) [] EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (eq E1 E2) [] EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< EN: case EN. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< case EN2. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.18: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 V1 EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< search. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (eq E1 E2) [] EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (eq E1 E2) [] EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< EN: case EN. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< case EN2. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.19: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 EE1 O2 V2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 V2 EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< search. Subgoal 1.20: Variables: FE EE_B Ctx EE_A' N Len S IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (stringLit S) [] EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalExpr FE EE_B (stringLit S) (stringVal S) EE_B' []
< search. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (appString E1 E2) [] EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< case IsE. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (appString E1 E2) [] EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< EN: case EN. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< case EN2. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ _ EvB1. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< apply IH_E to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 1.21: Variables: FE EE_A EE_B Ctx EE_A' O N Len S1 EE1 O2 S2 O3 S E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : ctx_names EE_B' Ctx H6 : evalExpr FE EE_B' E2 (stringVal S2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< search. Subgoal 1.22: Variables: FE EE_B V Ctx EE_A' N Len X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (name X) [] EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' V ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< case IsE. Subgoal 1.22: Variables: FE EE_B V Ctx EE_A' N Len X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (name X) [] EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' V H1 : is_string X ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< EN: case EN. Subgoal 1.22: Variables: FE EE_B V Ctx EE_A' N Len X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' V H1 : is_string X EN : mems X Ctx ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< apply newNameScopes_ctx_names_lookupScopes to NNS Ctxs EN EvA1. Subgoal 1.22: Variables: FE EE_B V Ctx EE_A' N Len X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B EvA1 : lookupScopes X EE_A' V H1 : is_string X EN : mems X Ctx H2 : lookupScopes X EE_B V ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< search. Subgoal 1.23: Variables: FE EE_A EE_B V Ctx EE_A' O N Len RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (call Fun Args) [] EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< case IsE. Subgoal 1.23: Variables: FE EE_A EE_B V Ctx EE_A' O N Len RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (call Fun Args) [] EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< EN: case EN. Subgoal 1.23: Variables: FE EE_A EE_B V Ctx EE_A' O N Len RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args EN : argsNames Ctx Args [] ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< apply IH_A to _ _ _ _ _ Ctxs EN EvA2 NNS. Subgoal 1.23: Variables: FE EE_A EE_B V Ctx EE_A' O N Len RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args EN : argsNames Ctx Args [] H3 : evalArgs FE EE_B Args ArgVals EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< search. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (stmtExpr S E1) [] EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< case IsE. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (stmtExpr S E1) [] EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< EN: case EN. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = [] ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply stmtNames_isCtx to _ _ EN. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< Ctxs': apply ctx_names_add_scope to Ctxs. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S NS CtxS NE IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S NS CtxS EN1 : exprNames CtxS E1 NE EN2 : NS ++ NE = [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< case EN2. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< EvB1: apply IH_S to _ _ _ _ _ Ctxs' EN EvA1 NNS. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< NNS': apply evalStmt_newNameScopes to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply stmtNames_isCtx to _ _ EN. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_list (is_list is_string) CtxS ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< Ctxs'': apply evalStmt_ctx_names to _ _ _ _ Ctxs' EN EvB1. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_list (is_list is_string) CtxS Ctxs'' : ctx_names EE_B' CtxS ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< EvB2: apply IH_E to _ _ _ _ _ Ctxs'' EN1 EvA2 NNS'. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S CtxS EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] CtxS EN1 : exprNames CtxS E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) CtxS Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_list (is_list is_string) CtxS Ctxs'' : ctx_names EE_B' CtxS EvB2 : evalExpr FE EE_B' E1 V EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply stmtNames_keep_older to _ _ EN. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] (Scope'::Ctx) EN1 : exprNames (Scope'::Ctx) E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) (Scope'::Ctx) Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_list (is_list is_string) (Scope'::Ctx) Ctxs'' : ctx_names EE_B' (Scope'::Ctx) EvB2 : evalExpr FE EE_B' E1 V EE_B'1 O3 H7 : forall X, mem X [] -> mem X Scope' ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ _ EN1 EvB2. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] (Scope'::Ctx) EN1 : exprNames (Scope'::Ctx) E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) (Scope'::Ctx) Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_list (is_list is_string) (Scope'::Ctx) Ctxs'' : ctx_names EE_B' (Scope'::Ctx) EvB2 : evalExpr FE EE_B' E1 V EE_B'1 O3 H7 : forall X, mem X [] -> mem X Scope' C : ctx_names EE_B'1 (Scope'::Ctx) ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< case C. Subgoal 1.24: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 Scope O3 E1 S EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 EN : stmtNames ([]::Ctx) S [] (Scope'::Ctx) EN1 : exprNames (Scope'::Ctx) E1 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) (Scope'::Ctx) Ctxs' : ctx_names ([]::EE_B) ([]::Ctx) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 NNS' : newNameScopes N Len EE1 EE_B' H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_list (is_list is_string) (Scope'::Ctx) Ctxs'' : ctx_names EE_B' (Scope'::Ctx) EvB2 : evalExpr FE EE_B' E1 V (A::ARest) O3 H7 : forall X, mem X [] -> mem X Scope' H8 : forall K I, mem (K, I) A -> mem K Scope' H9 : forall K, mem K Scope' -> exists I, mem (K, I) A H10 : ctx_names ARest Ctx ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< search. Subgoal 1.25: Variables: FE EE_A EE_B Ctx EE_A' O N Len VF RF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (recBuild RF) [] EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< case IsE. Subgoal 1.25: Variables: FE EE_A EE_B Ctx EE_A' O N Len VF RF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (recBuild RF) [] EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O * H1 : is_recFieldExprs RF ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< EN: case EN. Subgoal 1.25: Variables: FE EE_A EE_B Ctx EE_A' O N Len VF RF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O * H1 : is_recFieldExprs RF EN : recFieldNames Ctx RF [] ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< apply IH_RF to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.25: Variables: FE EE_A EE_B Ctx EE_A' O N Len VF RF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalRecFields FE EE_A RF VF EE_A' O * H1 : is_recFieldExprs RF EN : recFieldNames Ctx RF [] H2 : evalRecFields FE EE_B RF VF EE_B' O ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< search. Subgoal 1.26: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields F Rec IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (recFieldAccess Rec F) [] EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< case IsE. Subgoal 1.26: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields F Rec IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (recFieldAccess Rec F) [] EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< EN: case EN. Subgoal 1.26: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields F Rec IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F EN : exprNames Ctx Rec [] ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.26: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields F Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F EN : exprNames Ctx Rec [] H3 : evalExpr FE EE_B Rec (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< search. Subgoal 2.1: Variables: FE EE_A EE_B Ctx Ctx' N Len Scope IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx noop [] Ctx' EvA : evalStmt FE (Scope::EE_A) noop (Scope::EE_A) [] @ NNS : newNameScopes N Len EE_A EE_B ============================ exists EE_B', evalStmt FE (Scope::EE_B) noop EE_B' []
< search. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (seq S1 S2) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< case IsS. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (seq S1 S2) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< SN: case SN. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply stmtNames_isCtx to _ _ SN. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 N2 Ctx3 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 N2 Ctx3 SN1 : stmtNames Ctx3 S2 N3 Ctx' SN2 : N2 ++ N3 = [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< case SN2. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< EvB1: apply IH_S to _ _ _ _ _ Ctxs SN EvA1 NNS. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< NNS': apply evalStmt_newNameScopes to _ _ _ _ EvA1 EvB1 NNS. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< Ctxs': apply evalStmt_ctx_names to _ _ _ _ Ctxs SN EvB1. Subgoal 2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< NNS': case NNS' (keep). Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' N1 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 NNS'1 : length EE_B' Len NNS'2 : drop N1 EE1 EE_B' NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names EE_B' BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< LenB+: apply length_exists_list_pair_string_value to IsB. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' N1 SNames BNames N4 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 NNS'1 : length EE_B' Len NNS'2 : drop N1 EE1 EE_B' NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names EE_B' BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N4 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< LenB: case LenB+ (keep). Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' N1 SNames BNames N4 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 NNS'1 : length EE_B' Len NNS'2 : drop N1 EE1 EE_B' NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names EE_B' BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N4 LenB : length EE_B N' LenB1 : 1 + N' = N4 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< LEq: apply newNameScopes_length to NNS LenB. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' N1 SNames BNames N4 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 NNS'1 : length EE_B' Len NNS'2 : drop N1 EE1 EE_B' NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names EE_B' BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N4 LenB : length EE_B N' LenB1 : 1 + N' = N4 LEq : Len <= N' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< LenEE_B': apply evalStmt_keep_scopes to _ _ _ EvB1 LenB+. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' N1 SNames BNames N4 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 NNS'1 : length EE_B' Len NNS'2 : drop N1 EE1 EE_B' NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names EE_B' BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N4 LenB : length EE_B N' LenB1 : 1 + N' = N4 LEq : Len <= N' LenEE_B' : length EE_B' N4 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply cons_length to LenB+. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 EE_B' N1 SNames BNames N4 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 EE_B' O2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes N Len EE1 EE_B' Ctxs' : ctx_names EE_B' Ctx3 NNS'1 : length EE_B' Len NNS'2 : drop N1 EE1 EE_B' NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names EE_B' BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N4 LenB : length EE_B N' LenB1 : 1 + N' = N4 LEq : Len <= N' LenEE_B' : length EE_B' N4 H6 : N4 > 0 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply length_cons to LenEE_B' _. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 N1 SNames BNames N4 N' H T IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 (H::T) O2 H5 : is_list (is_list (is_pair is_string is_value)) (H::T) NNS' : newNameScopes N Len EE1 (H::T) Ctxs' : ctx_names (H::T) Ctx3 NNS'1 : length (H::T) Len NNS'2 : drop N1 EE1 (H::T) NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names (H::T) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) N4 LenB : length EE_B N' LenB1 : 1 + N' = N4 LEq : Len <= N' LenEE_B' : length (H::T) N4 H6 : N4 > 0 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply length_unique to LenEE_B' NNS'1. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 N1 SNames BNames N' H T IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 (H::T) O2 H5 : is_list (is_list (is_pair is_string is_value)) (H::T) NNS' : newNameScopes N Len EE1 (H::T) Ctxs' : ctx_names (H::T) Ctx3 NNS'1 : length (H::T) Len NNS'2 : drop N1 EE1 (H::T) NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names (H::T) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) Len LenB : length EE_B N' LenB1 : 1 + N' = Len LEq : Len <= N' LenEE_B' : length (H::T) Len H6 : Len > 0 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply length_is to LenB. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 N1 SNames BNames N' H T IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 (H::T) O2 H5 : is_list (is_list (is_pair is_string is_value)) (H::T) NNS' : newNameScopes N Len EE1 (H::T) Ctxs' : ctx_names (H::T) Ctx3 NNS'1 : length (H::T) Len NNS'2 : drop N1 EE1 (H::T) NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names (H::T) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) Len LenB : length EE_B N' LenB1 : 1 + N' = Len LEq : Len <= N' LenEE_B' : length (H::T) Len H6 : Len > 0 H7 : is_integer N' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< L: apply lt_plus_one to LenB1 _. Subgoal 2.2.1: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 O3 S2 S1 Ctx3 N1 SNames BNames N' H T IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 (H::T) O2 H5 : is_list (is_list (is_pair is_string is_value)) (H::T) NNS' : newNameScopes N Len EE1 (H::T) Ctxs' : ctx_names (H::T) Ctx3 NNS'1 : length (H::T) Len NNS'2 : drop N1 EE1 (H::T) NNS'3 : take N1 EE1 N NNS'4 : names N SNames NNS'5 : names (H::T) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB+ : length (Scope::EE_B) Len LenB : length EE_B N' LenB1 : 1 + N' = Len LEq : Len <= N' LenEE_B' : length (H::T) Len H6 : Len > 0 H7 : is_integer N' L : N' < Len ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply less_lesseq_flip_false to L LEq. Subgoal 2.2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope O2 O3 S2 S1 Ctx3 BR S3 AR IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (S3::AR) O2 * EvA2 : evalStmt FE (S3::AR) S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) (S3::AR) H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 (S3::BR) O2 H5 : is_list (is_list (is_pair is_string is_value)) (S3::BR) NNS' : newNameScopes N Len (S3::AR) (S3::BR) Ctxs' : ctx_names (S3::BR) Ctx3 NNS'1 : newNameScopes N Len AR BR ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< apply IH_S to _ _ _ _ _ Ctxs' SN1 EvA2 NNS'1. Subgoal 2.2.2: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope O2 O3 S2 S1 Ctx3 BR S3 AR EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx EvA : evalStmt FE (Scope::EE_A) (seq S1 S2) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE (Scope::EE_A) S1 (S3::AR) O2 * EvA2 : evalStmt FE (S3::AR) S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 SN : stmtNames Ctx S1 [] Ctx3 SN1 : stmtNames Ctx3 S2 [] Ctx' H3 : is_list (is_list (is_pair is_string is_value)) (S3::AR) H4 : is_list (is_list is_string) Ctx3 EvB1 : evalStmt FE (Scope::EE_B) S1 (S3::BR) O2 H5 : is_list (is_list (is_pair is_string is_value)) (S3::BR) NNS' : newNameScopes N Len (S3::AR) (S3::BR) Ctxs' : ctx_names (S3::BR) Ctx3 NNS'1 : newNameScopes N Len AR BR H6 : evalStmt FE (S3::BR) S2 EE_B'1 O3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (seq S1 S2) EE_B' O
< search. Subgoal 2.3: Variables: FE EE_A EE_B Ctx Ctx' O N Len Scope EE1 Scope1 V X E Ty IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (declare Ty X E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * ============================ exists EE_B', evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O
< case IsS. Subgoal 2.3: Variables: FE EE_A EE_B Ctx Ctx' O N Len Scope EE1 Scope1 V X E Ty IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (declare Ty X E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O
< SN: case SN. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty Ctx1 Scope2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SN : exprNames (Scope2::Ctx1) E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O
< EvB: apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty Ctx1 Scope2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SN : exprNames (Scope2::Ctx1) E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN EvB. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty Ctx1 Scope2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SN : exprNames (Scope2::Ctx1) E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O C : ctx_names EE_B' (Scope2::Ctx1) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O
< case C. Subgoal 2.3: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty Ctx1 Scope2 ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (declare Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E SN : exprNames (Scope2::Ctx1) E [] EvB : evalExpr FE (Scope::EE_B) E V (A::ARest) O H4 : forall K I, mem (K, I) A -> mem K Scope2 H5 : forall K, mem K Scope2 -> exists I, mem (K, I) A H6 : ctx_names ARest Ctx1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (declare Ty X E) EE_B' O
< search. Subgoal 2.4: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope V EE1 E X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (assign X E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< case IsS. Subgoal 2.4: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope V EE1 E X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (assign X E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< SN: case SN. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< EvB: apply IH_E to _ _ _ _ _ Ctxs SN1 EvA1 _. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< IsEE_B': apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< IsEE1: apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN1 EvB. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB _. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H3 : is_value V ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< apply newNameScopes_replaceScopes_back to IsEE1 IsEE_B' _ _ C SN NNS' EvA2. Subgoal 2.4: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 E X EE_B' RB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assign X E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E SN : mems X Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H3 : is_value V H4 : replaceScopes X V EE_B' RB ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assign X E) EE_B' O
< search. Subgoal 2.5: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (recUpdate Rec Fields E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< case IsS. Subgoal 2.5: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (recUpdate Rec Fields E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< SN: case SN. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< EvB: apply IH_E to _ _ _ _ _ Ctxs SN1 EvA1 _. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< IsEE_B': apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< IsEE1: apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN1 EvB. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB _. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< IsV: apply evalExpr_isValue to _ _ _ EvA1. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' IsV : is_value V ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< IsRF: apply lookupScopes_is to _ EvA2. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' IsV : is_value V IsRF : is_value (recVal FieldVals) IsRF1 : is_string Rec ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< case IsRF. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' IsV : is_value V IsRF1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< apply updateRecFields_is to _ _ _ EvA3. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' IsV : is_value V IsRF1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< apply newNameScopes_ctx_names_lookupScopes to _ Ctxs _ EvA2. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' IsV : is_value V IsRF1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals H6 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< apply newNameScopes_replaceScopes_back to _ _ _ _ C SN NNS' EvA4. Subgoal 2.5: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope V EE1 FieldVals NewVals E Fields Rec EE_B' RB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V EE1 O * EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E SN : mems Rec Ctx' SN1 : exprNames Ctx' E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O IsEE_B' : is_list (is_list (is_pair is_string is_value)) EE_B' IsEE1 : is_list (is_list (is_pair is_string is_value)) EE1 C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' IsV : is_value V IsRF1 : is_string Rec H4 : is_list (is_pair is_string is_value) FieldVals H5 : is_list (is_pair is_string is_value) NewVals H6 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals) H7 : replaceScopes Rec (recVal NewVals) EE_B' RB ============================ exists EE_B', evalStmt FE (Scope::EE_B) (recUpdate Rec Fields E) EE_B' O
< search. Subgoal 2.6: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case IsS. Subgoal 2.6: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< SN: case SN. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case SN4. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CN TN CtxT CtxF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF SN3 : CN ++ TN = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case SN3. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN EvB1. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply ctx_names_add_scope to C. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< EvB2: apply IH_S to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Th EE_B'1 O3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply stmtNames_keep_older to _ _ SN1. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxF EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] (Scope'::Ctx') SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Th EE_B'1 O3 H7 : forall X, mem X [] -> mem X Scope' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< C': apply evalStmt_ctx_names to _ _ _ _ _ SN1 EvB2. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxF EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] (Scope'::Ctx') SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Th EE_B'1 O3 H7 : forall X, mem X [] -> mem X Scope' C' : ctx_names EE_B'1 (Scope'::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case C'. Subgoal 2.6: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxF EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] (Scope'::Ctx') SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Th (A::ARest) O3 H7 : forall X, mem X [] -> mem X Scope' H8 : forall K I, mem (K, I) A -> mem K Scope' H9 : forall K, mem K Scope' -> exists I, mem (K, I) A H10 : ctx_names ARest Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< search. Subgoal 2.7: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case IsS. Subgoal 2.7: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (ifThenElse Cond Th El) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< SN: case SN. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CN TN CtxT FN CtxF N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El FN CtxF SN3 : CN ++ TN = N2 SN4 : N2 ++ FN = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case SN4. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CN TN CtxT CtxF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Th TN CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF SN3 : CN ++ TN = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case SN3. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN EvB1. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply ctx_names_add_scope to C. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< EvB2: apply IH_S to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT CtxF EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] CtxF EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') El EE_B'1 O3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< apply stmtNames_keep_older to _ _ SN2. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') El EE_B'1 O3 H7 : forall X, mem X [] -> mem X Scope' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< C': apply evalStmt_ctx_names to _ _ _ _ _ SN2 EvB2. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') El EE_B'1 O3 H7 : forall X, mem X [] -> mem X Scope' C' : ctx_names EE_B'1 (Scope'::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< case C'. Subgoal 2.7: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 O3 El Th Cond CtxT EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope1::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Th [] CtxT SN2 : stmtNames ([]::Ctx') El [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') El (A::ARest) O3 H7 : forall X, mem X [] -> mem X Scope' H8 : forall K I, mem (K, I) A -> mem K Scope' H9 : forall K, mem K Scope' -> exists I, mem (K, I) A H10 : ctx_names ARest Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (ifThenElse Cond Th El) EE_B' O
< search. Subgoal 2.8: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (while Cond Body) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case IsS. Subgoal 2.8: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (while Cond Body) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< SN: case SN. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CN BN CtxB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Body BN CtxB SN2 : CN ++ BN = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case SN2. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN EvB1. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply ctx_names_add_scope to C. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< EvB2: apply IH_S to _ _ _ _ _ _ _ EvA2 NNS'. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond CtxB EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body EE_B'1 O3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply stmtNames_keep_older to _ _ SN1. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body EE_B'1 O3 H6 : forall X, mem X [] -> mem X Scope' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< C': apply evalStmt_ctx_names to _ _ _ _ _ SN1 EvB2. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' EE_B'1 Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body EE_B'1 O3 H6 : forall X, mem X [] -> mem X Scope' C' : ctx_names EE_B'1 (Scope'::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case C'. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case IsEE2+. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< IsARest+: apply evalStmt_isCtx to _ _ _ EvB2. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 IsARest+ : is_list (is_list (is_pair is_string is_value)) (A::ARest) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case IsARest+. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< NNS'': apply evalStmt_newNameScopes to _ _ _ _ EvA2 EvB2 _. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LenEEB+: apply length_exists_list_pair_string_value to IsB. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LenEEB: case LenEEB+ (keep). Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LEq: apply newNameScopes_length to NNS LenEEB. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LenEEB': apply evalExpr_keep_scopes to _ _ _ EvB1 LenEEB+. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< IsN2: apply length_is to LenEEB'. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< P: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LenEEB'+: assert length ([]::EE_B') N3. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LenAR+: apply evalStmt_keep_scopes to _ _ _ EvB2 LenEEB'+. Subgoal 2.8: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 LenAR+ : length (A::ARest) N3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< NNS'': case NNS'' (keep). Subgoal 2.8.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 LenAR+ : length (A::ARest) N3 NNS''1 : length (A::ARest) Len NNS''2 : drop N2 (Scope1::EE2) (A::ARest) NNS''3 : take N2 (Scope1::EE2) N NNS''4 : names N SNames NNS''5 : names (A::ARest) BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply length_unique to LenAR+ NNS''1. Subgoal 2.8.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = Len LenEEB'+ : length ([]::EE_B') Len LenAR+ : length (A::ARest) Len NNS''1 : length (A::ARest) Len NNS''2 : drop N2 (Scope1::EE2) (A::ARest) NNS''3 : take N2 (Scope1::EE2) N NNS''4 : names N SNames NNS''5 : names (A::ARest) BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< L: apply lt_plus_one to P _. Subgoal 2.8.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = Len LenEEB'+ : length ([]::EE_B') Len LenAR+ : length (A::ARest) Len NNS''1 : length (A::ARest) Len NNS''2 : drop N2 (Scope1::EE2) (A::ARest) NNS''3 : take N2 (Scope1::EE2) N NNS''4 : names N SNames NNS''5 : names (A::ARest) BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false L : N1 < Len ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply length_is to LenEEB. Subgoal 2.8.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = Len LenEEB'+ : length ([]::EE_B') Len LenAR+ : length (A::ARest) Len NNS''1 : length (A::ARest) Len NNS''2 : drop N2 (Scope1::EE2) (A::ARest) NNS''3 : take N2 (Scope1::EE2) N NNS''4 : names N SNames NNS''5 : names (A::ARest) BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false L : N1 < Len H14 : is_integer N' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< L': apply lt_plus_one to LenEEB1 _. Subgoal 2.8.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = Len LenEEB'+ : length ([]::EE_B') Len LenAR+ : length (A::ARest) Len NNS''1 : length (A::ARest) Len NNS''2 : drop N2 (Scope1::EE2) (A::ARest) NNS''3 : take N2 (Scope1::EE2) N NNS''4 : names N SNames NNS''5 : names (A::ARest) BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false L : N1 < Len H14 : is_integer N' L' : N' < N1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< L'': apply less_integer_transitive to L' L. Subgoal 2.8.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 Scope1 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) Scope1 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (Scope1::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = Len LenEEB'+ : length ([]::EE_B') Len LenAR+ : length (A::ARest) Len NNS''1 : length (A::ARest) Len NNS''2 : drop N2 (Scope1::EE2) (A::ARest) NNS''3 : take N2 (Scope1::EE2) N NNS''4 : names N SNames NNS''5 : names (A::ARest) BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false L : N1 < Len H14 : is_integer N' L' : N' < N1 L'' : N' < Len ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply less_lesseq_flip_false to L'' LEq. Subgoal 2.8.2: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 LenAR+ : length (A::ARest) N3 NNS''1 : newNameScopes N Len EE2 ARest ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< NNS'': case NNS''1. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 LenAR+ : length (A::ARest) N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< LenAR: case LenAR+. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 N2 SNames BNames N'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false LenAR : length ARest N'1 LenAR1 : 1 + N'1 = N3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply length_unique to LenAR NNS''1. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false LenAR : length ARest Len LenAR1 : 1 + Len = N3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply length_is to LenAR. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false LenAR : length ARest Len LenAR1 : 1 + Len = N3 H14 : is_integer Len ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply length_is to LenEEB. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N1 N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false LenAR : length ARest Len LenAR1 : 1 + Len = N3 H14 : is_integer Len H15 : is_integer N' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply plus_integer_unique_addend to _ _ _ P LenAR1. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) Len LenEEB : length EE_B N' LenEEB1 : 1 + N' = Len LEq : Len <= N' LenEEB' : length EE_B' Len IsN2 : is_integer Len P : 1 + Len = N3 LenEEB'+ : length ([]::EE_B') N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false LenAR : length ARest Len LenAR1 : 1 + Len = N3 H14 : is_integer Len H15 : is_integer N' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< L: apply lt_plus_one to LenEEB1 _. Subgoal 2.8.2.1: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 EE2 O3 O4 O12 Body Cond EE_B' Scope' ARest A N' N3 N2 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::ARest) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names ARest Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) ARest NNS'' : newNameScopes N Len (A::EE2) (A::ARest) LenEEB+ : length (Scope::EE_B) Len LenEEB : length EE_B N' LenEEB1 : 1 + N' = Len LEq : Len <= N' LenEEB' : length EE_B' Len IsN2 : is_integer Len P : 1 + Len = N3 LenEEB'+ : length ([]::EE_B') N3 NNS''1 : length ARest Len NNS''2 : drop N2 EE2 ARest NNS''3 : take N2 EE2 N NNS''4 : names N SNames NNS''5 : names ARest BNames NNS''6 : forall X, mem X SNames -> mem X BNames -> false LenAR : length ARest Len LenAR1 : 1 + Len = N3 H14 : is_integer Len H15 : is_integer N' L : N' < Len ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply less_lesseq_flip_false to L LEq. Subgoal 2.8.2.2: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 O3 O4 O12 Body Cond EE_B' Scope' A N1 N' N3 BR S1 AR IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::(S1::AR)) O3 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::(S1::BR)) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names (S1::BR) Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) (S1::BR) NNS'' : newNameScopes N Len (A::(S1::AR)) (A::(S1::BR)) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 LenAR+ : length (A::(S1::BR)) N3 NNS''1 : newNameScopes N Len AR BR ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply IH_S to _ _ _ _ _ _ _ EvA3 NNS''1. Subgoal 2.8.2.2: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope EE1 O2 O3 O4 O12 Body Cond EE_B' Scope' A N1 N' N3 BR S1 AR EE_B'2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (A::(S1::AR)) O3 * EvA3 : evalStmt FE (S1::AR) (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] (Scope'::Ctx') EvB1 : evalExpr FE (Scope::EE_B) Cond trueVal EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' H5 : ctx_names ([]::EE_B') ([]::Ctx') EvB2 : evalStmt FE ([]::EE_B') Body (A::(S1::BR)) O3 H6 : forall X, mem X [] -> mem X Scope' H7 : forall K I, mem (K, I) A -> mem K Scope' H8 : forall K, mem K Scope' -> exists I, mem (K, I) A H9 : ctx_names (S1::BR) Ctx' H10 : is_list (is_pair is_string is_value) A H11 : is_list (is_list (is_pair is_string is_value)) (S1::AR) H12 : is_list (is_pair is_string is_value) A H13 : is_list (is_list (is_pair is_string is_value)) (S1::BR) NNS'' : newNameScopes N Len (A::(S1::AR)) (A::(S1::BR)) LenEEB+ : length (Scope::EE_B) N1 LenEEB : length EE_B N' LenEEB1 : 1 + N' = N1 LEq : Len <= N' LenEEB' : length EE_B' N1 IsN2 : is_integer N1 P : 1 + N1 = N3 LenEEB'+ : length ([]::EE_B') N3 LenAR+ : length (A::(S1::BR)) N3 NNS''1 : newNameScopes N Len AR BR H14 : evalStmt FE (S1::BR) (while Cond Body) EE_B'2 O4 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< search. Subgoal 2.9: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Body Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (while Cond Body) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O * ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case IsS. Subgoal 2.9: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Body Cond IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (while Cond Body) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O * H1 : is_expr Cond H2 : is_stmt Body ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< SN: case SN. Subgoal 2.9: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Body Cond CN BN CtxB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O * H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond CN SN1 : stmtNames ([]::Ctx') Body BN CtxB SN2 : CN ++ BN = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< case SN2. Subgoal 2.9: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Body Cond CtxB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O * H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.9: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Body Cond CtxB EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (while Cond Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal EE_A' O * H1 : is_expr Cond H2 : is_stmt Body SN : exprNames Ctx' Cond [] SN1 : stmtNames ([]::Ctx') Body [] CtxB H3 : evalExpr FE (Scope::EE_B) Cond falseVal EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (while Cond Body) EE_B' O
< search. Subgoal 2.10: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Scope1 S1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (scopeStmt S1) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< case IsS. Subgoal 2.10: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Scope1 S1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (scopeStmt S1) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< SN: case SN. Subgoal 2.10: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Scope1 S1 Ctx2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 [] Ctx2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< apply ctx_names_add_scope to Ctxs. Subgoal 2.10: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Scope1 S1 Ctx2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 [] Ctx2 H2 : ctx_names ([]::(Scope::EE_B)) ([]::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< EvB: apply IH_S to _ _ _ _ _ _ SN EvA1 _. Subgoal 2.10: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Scope1 S1 Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 [] Ctx2 H2 : ctx_names ([]::(Scope::EE_B)) ([]::Ctx') EvB : evalStmt FE ([]::(Scope::EE_B)) S1 EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< apply stmtNames_keep_older to _ _ SN. Subgoal 2.10: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Scope1 S1 EE_B' Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 [] (Scope'::Ctx') H2 : ctx_names ([]::(Scope::EE_B)) ([]::Ctx') EvB : evalStmt FE ([]::(Scope::EE_B)) S1 EE_B' O H3 : forall X, mem X [] -> mem X Scope' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< C: apply evalStmt_ctx_names to _ _ _ _ _ SN EvB. Subgoal 2.10: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Scope1 S1 EE_B' Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 [] (Scope'::Ctx') H2 : ctx_names ([]::(Scope::EE_B)) ([]::Ctx') EvB : evalStmt FE ([]::(Scope::EE_B)) S1 EE_B' O H3 : forall X, mem X [] -> mem X Scope' C : ctx_names EE_B' (Scope'::Ctx') ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< case C. Subgoal 2.10: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Scope1 S1 Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (scopeStmt S1) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalStmt FE ([]::(Scope::EE_A)) S1 (Scope1::EE_A') O * H1 : is_stmt S1 SN : stmtNames ([]::Ctx') S1 [] (Scope'::Ctx') H2 : ctx_names ([]::(Scope::EE_B)) ([]::Ctx') EvB : evalStmt FE ([]::(Scope::EE_B)) S1 (A::ARest) O H3 : forall X, mem X [] -> mem X Scope' H4 : forall K I, mem (K, I) A -> mem K Scope' H5 : forall K, mem K Scope' -> exists I, mem (K, I) A H6 : ctx_names ARest Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (scopeStmt S1) EE_B' O
< search. Subgoal 2.11: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope I O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< case IsS. Subgoal 2.11: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope I O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< SN: case SN. Subgoal 2.11: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope I O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O H1 : is_expr E SN : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< apply IH_E to _ _ _ _ _ _ SN EvA1 _. Subgoal 2.11: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope I O2 E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O H1 : is_expr E SN : exprNames Ctx' E [] H2 : evalExpr FE (Scope::EE_B) E (intVal I) EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< search. Subgoal 2.12: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< case IsS. Subgoal 2.12: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< SN: case SN. Subgoal 2.12: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O H1 : is_expr E SN : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< apply IH_E to _ _ _ _ _ _ SN EvA1 _. Subgoal 2.12: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope O2 E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O H1 : is_expr E SN : exprNames Ctx' E [] H2 : evalExpr FE (Scope::EE_B) E trueVal EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< search. Subgoal 2.13: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< case IsS. Subgoal 2.13: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< SN: case SN. Subgoal 2.13: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O H1 : is_expr E SN : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< apply IH_E to _ _ _ _ _ _ SN EvA1 _. Subgoal 2.13: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope O2 E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O H1 : is_expr E SN : exprNames Ctx' E [] H2 : evalExpr FE (Scope::EE_B) E falseVal EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< search. Subgoal 2.14: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope S1 O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< case IsS. Subgoal 2.14: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope S1 O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (printVal E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< SN: case SN. Subgoal 2.14: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope S1 O2 E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O H1 : is_expr E SN : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< apply IH_E to _ _ _ _ _ _ SN EvA1 _. Subgoal 2.14: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope S1 O2 E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (printVal E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O H1 : is_expr E SN : exprNames Ctx' E [] H2 : evalExpr FE (Scope::EE_B) E (stringVal S1) EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (printVal E) EE_B' O
< search. Subgoal 3.1: Variables: FE EE_B Ctx EE_A' N Len IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx AN : argsNames Ctx nilArgs [] EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalArgs FE EE_B nilArgs [] EE_B' []
< search. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx AN : argsNames Ctx (consArgs E Rest) [] EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< case IsA. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx AN : argsNames Ctx (consArgs E Rest) [] EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< AN: case AN. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EN AN IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E EN AN1 : argsNames Ctx Rest AN AN2 : EN ++ AN = [] ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< case AN2. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ _ AN EvA1 _. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ Ctxs AN EvB1. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : newNameScopes N Len EE1 EE_B' H6 : ctx_names EE_B' Ctx ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply IH_A to _ _ _ _ _ _ AN1 EvA2 _. Subgoal 3.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 Rest E EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest AN : exprNames Ctx E [] AN1 : argsNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : newNameScopes N Len EE1 EE_B' H6 : ctx_names EE_B' Ctx H7 : evalArgs FE EE_B' Rest VRest EE_B'1 O3 ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< search. Subgoal 4.1: Variables: FE EE_B Ctx EE_A' N Len IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx RFN : recFieldNames Ctx nilRecFieldExprs [] EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalRecFields FE EE_B nilRecFieldExprs [] EE_B' []
< search. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E Rest) [] EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< case IsRF. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx RFN : recFieldNames Ctx (consRecFieldExprs F E Rest) [] EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< RFN: case RFN. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EN RN IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E EN RFN1 : recFieldNames Ctx Rest RN RFN2 : EN ++ RN = [] ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< case RFN2. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ _ RFN EvA1 _. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ Ctxs RFN EvB1. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : newNameScopes N Len EE1 EE_B' H7 : ctx_names EE_B' Ctx ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply IH_RF to _ _ _ _ _ _ RFN1 EvA2 _. Subgoal 4.2: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 VRest V1 F Rest E EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest RFN : exprNames Ctx E [] RFN1 : recFieldNames Ctx Rest [] EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : newNameScopes N Len EE1 EE_B' H7 : ctx_names EE_B' Ctx H8 : evalRecFields FE EE_B' Rest VRest EE_B'1 O3 ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< search. Proof completed.
< Theorem scopes_same_lookupScopes_exists : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V -> lookupScopes X B V. ============================ forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V -> lookupScopes X B V
< induction on 4. IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V ============================ forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V @ -> lookupScopes X B V
< intros IsB IsX SS L. Variables: A B X V IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same A B L : lookupScopes X A V @ ============================ lookupScopes X B V
< L: case L. Subgoal 1: Variables: B X V Rest L IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same (L::Rest) B L : lookup L X V ============================ lookupScopes X B V
< SS: case SS. Subgoal 1: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsB : is_list (is_list (is_pair is_string is_value)) (B1::BRest) IsX : is_string X L : lookup L X V SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest ============================ lookupScopes X (B1::BRest) V
< apply SS to L. Subgoal 1: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsB : is_list (is_list (is_pair is_string is_value)) (B1::BRest) IsX : is_string X L : lookup L X V SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : lookup B1 X V ============================ lookupScopes X (B1::BRest) V
< search. Subgoal 2: Variables: B X V Rest L IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same (L::Rest) B L : no_lookup L X L1 : lookupScopes X Rest V * ============================ lookupScopes X B V
< SS: case SS. Subgoal 2: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsB : is_list (is_list (is_pair is_string is_value)) (B1::BRest) IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest ============================ lookupScopes X (B1::BRest) V
< IsB: case IsB. Subgoal 2: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest ============================ lookupScopes X (B1::BRest) V
< Or: apply lookup_string_value_list_or_no to IsB IsX. Subgoal 2: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest Or : (exists V, lookup B1 X V) \/ no_lookup B1 X ============================ lookupScopes X (B1::BRest) V
< N: case Or. Subgoal 2.1: Variables: X V Rest L BRest B1 V1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest N : lookup B1 X V1 ============================ lookupScopes X (B1::BRest) V
< L': apply SS1 to N. Subgoal 2.1: Variables: X V Rest L BRest B1 V1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest N : lookup B1 X V1 L' : lookup L X V1 ============================ lookupScopes X (B1::BRest) V
< apply no_lookup to L L'. Subgoal 2.2: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest N : no_lookup B1 X ============================ lookupScopes X (B1::BRest) V
< apply IH to _ IsX SS2 L1. Subgoal 2.2: Variables: X V Rest L BRest B1 IH : forall A B X V, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A V * -> lookupScopes X B V IsX : is_string X L : no_lookup L X L1 : lookupScopes X Rest V * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest N : no_lookup B1 X H1 : lookupScopes X BRest V ============================ lookupScopes X (B1::BRest) V
< search. Proof completed.
< Theorem scopes_same_lookupScopes : forall A B X VA VB, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A VA -> lookupScopes X B VB -> VA = VB. ============================ forall A B X VA VB, is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> lookupScopes X A VA -> lookupScopes X B VB -> VA = VB
< intros IsB IsX SS LA LB. Variables: A B X VA VB IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same A B LA : lookupScopes X A VA LB : lookupScopes X B VB ============================ VA = VB
< LB': apply scopes_same_lookupScopes_exists to _ _ SS LA. Variables: A B X VA VB IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same A B LA : lookupScopes X A VA LB : lookupScopes X B VB LB' : lookupScopes X B VA ============================ VA = VB
< apply lookupScopes_unique to LB LB'. Variables: A B X VA IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same A B LA : lookupScopes X A VA LB : lookupScopes X B VA LB' : lookupScopes X B VA ============================ VA = VA
< search. Proof completed.
< Theorem remove_all_exists : forall X EE, is_list (is_pair is_string is_value) EE -> is_string X -> exists EE', remove_all EE X EE'. ============================ forall X EE, is_list (is_pair is_string is_value) EE -> is_string X -> exists EE', remove_all EE X EE'
< induction on 1. IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' ============================ forall X EE, is_list (is_pair is_string is_value) EE @ -> is_string X -> exists EE', remove_all EE X EE'
< intros IsEE IsX. Variables: X EE IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsEE : is_list (is_pair is_string is_value) EE @ IsX : is_string X ============================ exists EE', remove_all EE X EE'
< Is: case IsEE. Subgoal 1: Variables: X IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X ============================ exists EE', remove_all [] X EE'
< search. Subgoal 2: Variables: X T H IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X Is : is_pair is_string is_value H Is1 : is_list (is_pair is_string is_value) T * ============================ exists EE', remove_all (H::T) X EE'
< RA: apply IH to Is1 IsX. Subgoal 2: Variables: X T H EE' IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X Is : is_pair is_string is_value H Is1 : is_list (is_pair is_string is_value) T * RA : remove_all T X EE' ============================ exists EE', remove_all (H::T) X EE'
< IsP: case Is. Subgoal 2: Variables: X T EE' B A IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X Is1 : is_list (is_pair is_string is_value) T * RA : remove_all T X EE' IsP : is_string A IsP1 : is_value B ============================ exists EE', remove_all ((A, B)::T) X EE'
< Or: apply is_string_eq_or_not to IsP IsX. Subgoal 2: Variables: X T EE' B A IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X Is1 : is_list (is_pair is_string is_value) T * RA : remove_all T X EE' IsP : is_string A IsP1 : is_value B Or : A = X \/ (A = X -> false) ============================ exists EE', remove_all ((A, B)::T) X EE'
< E: case Or. Subgoal 2.1: Variables: X T EE' B IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X Is1 : is_list (is_pair is_string is_value) T * RA : remove_all T X EE' IsP : is_string X IsP1 : is_value B ============================ exists EE', remove_all ((X, B)::T) X EE'
< search. Subgoal 2.2: Variables: X T EE' B A IH : forall X EE, is_list (is_pair is_string is_value) EE * -> is_string X -> exists EE', remove_all EE X EE' IsX : is_string X Is1 : is_list (is_pair is_string is_value) T * RA : remove_all T X EE' IsP : is_string A IsP1 : is_value B E : A = X -> false ============================ exists EE', remove_all ((A, B)::T) X EE'
< search. Proof completed.
< Theorem scopes_same_replaceScopes_exists : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' -> exists B', replaceScopes X V B B'. ============================ forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' -> exists B', replaceScopes X V B B'
< induction on 5. IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' ============================ forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' @ -> exists B', replaceScopes X V B B'
< intros IsA IsB IsX SS RS. Variables: A B X V A' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same A B RS : replaceScopes X V A A' @ ============================ exists B', replaceScopes X V B B'
< RS: case RS. Subgoal 1: Variables: B X V I Rest LRemain L IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same (L::Rest) B RS : mem (X, I) L RS1 : remove_all L X LRemain ============================ exists B', replaceScopes X V B B'
< SS: case SS. Subgoal 1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (B1::BRest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest ============================ exists B', replaceScopes X V (B1::BRest) B'
< IsB: case IsB. Subgoal 1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest ============================ exists B', replaceScopes X V (B1::BRest) B'
< Or: apply lookup_string_value_list_or_no to IsB IsX. Subgoal 1: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest Or : (exists V, lookup B1 X V) \/ no_lookup B1 X ============================ exists B', replaceScopes X V (B1::BRest) B'
< L: case Or. Subgoal 1.1: Variables: X V I Rest LRemain L BRest B1 V1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : lookup B1 X V1 ============================ exists B', replaceScopes X V (B1::BRest) B'
< apply lookup_mem to L. Subgoal 1.1: Variables: X V I Rest LRemain L BRest B1 V1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : lookup B1 X V1 H1 : mem (X, V1) B1 ============================ exists B', replaceScopes X V (B1::BRest) B'
< apply remove_all_exists to IsB IsX. Subgoal 1.1: Variables: X V I Rest LRemain L BRest B1 V1 EE' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : lookup B1 X V1 H1 : mem (X, V1) B1 H2 : remove_all B1 X EE' ============================ exists B', replaceScopes X V (B1::BRest) B'
< search. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : no_lookup B1 X ============================ exists B', replaceScopes X V (B1::BRest) B'
< case IsA. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : no_lookup B1 X H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists B', replaceScopes X V (B1::BRest) B'
< L': apply mem_lookup to _ RS. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 V' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : no_lookup B1 X H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest L' : lookup L X V' ============================ exists B', replaceScopes X V (B1::BRest) B'
< LB: apply SS to L'. Subgoal 1.2: Variables: X V I Rest LRemain L BRest B1 V' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : mem (X, I) L RS1 : remove_all L X LRemain SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest L : no_lookup B1 X H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest L' : lookup L X V' LB : lookup B1 X V' ============================ exists B', replaceScopes X V (B1::BRest) B'
< apply no_lookup to L LB. Subgoal 2: Variables: B X V New L Rest IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same (L::Rest) B RS : no_lookup L X RS1 : replaceScopes X V Rest New * ============================ exists B', replaceScopes X V B B'
< SS: case SS. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (B1::BRest) IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest ============================ exists B', replaceScopes X V (B1::BRest) B'
< case IsA. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsB : is_list (is_list (is_pair is_string is_value)) (B1::BRest) IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists B', replaceScopes X V (B1::BRest) B'
< IsB: case IsB. Subgoal 2: Variables: X V New L Rest BRest B1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest ============================ exists B', replaceScopes X V (B1::BRest) B'
< apply IH to _ _ IsX SS2 RS1. Subgoal 2: Variables: X V New L Rest BRest B1 B' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest H3 : replaceScopes X V BRest B' ============================ exists B', replaceScopes X V (B1::BRest) B'
< Or: apply lookup_string_value_list_or_no to IsB IsX. Subgoal 2: Variables: X V New L Rest BRest B1 B' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest H3 : replaceScopes X V BRest B' Or : (exists V, lookup B1 X V) \/ no_lookup B1 X ============================ exists B', replaceScopes X V (B1::BRest) B'
< L: case Or. Subgoal 2.1: Variables: X V New L Rest BRest B1 B' V1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest H3 : replaceScopes X V BRest B' L : lookup B1 X V1 ============================ exists B', replaceScopes X V (B1::BRest) B'
< L': apply SS1 to L. Subgoal 2.1: Variables: X V New L Rest BRest B1 B' V1 IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest H3 : replaceScopes X V BRest B' L : lookup B1 X V1 L' : lookup L X V1 ============================ exists B', replaceScopes X V (B1::BRest) B'
< apply no_lookup to RS L'. Subgoal 2.2: Variables: X V New L Rest BRest B1 B' IH : forall A B X V A', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> exists B', replaceScopes X V B B' IsX : is_string X RS : no_lookup L X RS1 : replaceScopes X V Rest New * SS : forall X V, lookup L X V -> lookup B1 X V SS1 : forall X V, lookup B1 X V -> lookup L X V SS2 : scopes_same Rest BRest H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest IsB : is_list (is_pair is_string is_value) B1 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest H3 : replaceScopes X V BRest B' L : no_lookup B1 X ============================ exists B', replaceScopes X V (B1::BRest) B'
< search. Proof completed.
< Theorem scopes_same_replaceScopes_scopes_same : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' -> replaceScopes X V B B' -> scopes_same A' B'. ============================ forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' -> replaceScopes X V B B' -> scopes_same A' B'
< induction on 5. IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' ============================ forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' @ -> replaceScopes X V B B' -> scopes_same A' B'
< intros IsA IsB IsX SS RSA RSB. Variables: A B X V A' B' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same A B RSA : replaceScopes X V A A' @ RSB : replaceScopes X V B B' ============================ scopes_same A' B'
< RSA: case RSA. Subgoal 1: Variables: B X V B' I Rest LRemain L IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same (L::Rest) B RSB : replaceScopes X V B B' RSA : mem (X, I) L RSA1 : remove_all L X LRemain ============================ scopes_same (((X, V)::LRemain)::Rest) B'
< RSB: case RSB. Subgoal 1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 ============================ scopes_same (((X, V)::LRemain)::Rest) (((X, V)::LRemain1)::Rest1)
< SS: case SS. Subgoal 1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ scopes_same (((X, V)::LRemain)::Rest) (((X, V)::LRemain1)::Rest1)
< unfold . Subgoal 1.1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ forall X1 V1, lookup ((X, V)::LRemain) X1 V1 -> lookup ((X, V)::LRemain1) X1 V1
< intros L. Subgoal 1.1.1: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : lookup ((X, V)::LRemain) X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< L: case L. Subgoal 1.1.1.1: Variables: I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X1 RSA : mem (X1, I) L RSA1 : remove_all L X1 LRemain RSB : mem (X1, I1) L1 RSB1 : remove_all L1 X1 LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ lookup ((X1, V1)::LRemain1) X1 V1
< search. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< L': apply remove_all_lookup_other to RSA1 L1 _. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 L' : lookup L X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< LB: apply SS to L'. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 L' : lookup L X1 V1 LB : lookup L1 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< apply remove_all_lookup_other_back to RSB1 LB _. Subgoal 1.1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain X1 V1 L' : lookup L X1 V1 LB : lookup L1 X1 V1 H1 : lookup LRemain1 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< search. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ forall X1 V1, lookup ((X, V)::LRemain1) X1 V1 -> lookup ((X, V)::LRemain) X1 V1
< intros L. Subgoal 1.1.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : lookup ((X, V)::LRemain1) X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< L: case L. Subgoal 1.1.2.1: Variables: I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X1 RSA : mem (X1, I) L RSA1 : remove_all L X1 LRemain RSB : mem (X1, I1) L1 RSB1 : remove_all L1 X1 LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ lookup ((X1, V1)::LRemain) X1 V1
< search. Subgoal 1.1.2.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain1 X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< L': apply remove_all_lookup_other to RSB1 L1 _. Subgoal 1.1.2.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain1 X1 V1 L' : lookup L1 X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< LA: apply SS1 to L'. Subgoal 1.1.2.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain1 X1 V1 L' : lookup L1 X1 V1 LA : lookup L X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< apply remove_all_lookup_other_back to RSA1 LA _. Subgoal 1.1.2.2: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 X1 V1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 L : X = X1 -> false L1 : lookup LRemain1 X1 V1 L' : lookup L1 X1 V1 LA : lookup L X1 V1 H1 : lookup LRemain X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< search. Subgoal 1.1.3: Variables: X V I Rest LRemain L I1 Rest1 LRemain1 L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : mem (X, I1) L1 RSB1 : remove_all L1 X LRemain1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ scopes_same Rest Rest1
< search. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New ============================ scopes_same (((X, V)::LRemain)::Rest) (L1::New)
< case IsA. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ scopes_same (((X, V)::LRemain)::Rest) (L1::New)
< LA: apply mem_lookup to _ RSA. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 V' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest LA : lookup L X V' ============================ scopes_same (((X, V)::LRemain)::Rest) (L1::New)
< SS: case SS. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 V' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest LA : lookup L X V' SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ scopes_same (((X, V)::LRemain)::Rest) (L1::New)
< LB: apply SS to LA. Subgoal 1.2: Variables: X V I Rest LRemain L New L1 Rest1 V' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : mem (X, I) L RSA1 : remove_all L X LRemain RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest LA : lookup L X V' SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 LB : lookup L1 X V' ============================ scopes_same (((X, V)::LRemain)::Rest) (L1::New)
< apply no_lookup to RSB LB. Subgoal 2: Variables: B X V B' New L Rest IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) B IsX : is_string X SS : scopes_same (L::Rest) B RSB : replaceScopes X V B B' RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * ============================ scopes_same (L::New) B'
< RSB: case RSB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : mem (X, I) L1 RSB1 : remove_all L1 X LRemain ============================ scopes_same (L::New) (((X, V)::LRemain)::Rest1)
< case IsB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : mem (X, I) L1 RSB1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 ============================ scopes_same (L::New) (((X, V)::LRemain)::Rest1)
< LB: apply mem_lookup to _ RSB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 V' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : mem (X, I) L1 RSB1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 LB : lookup L1 X V' ============================ scopes_same (L::New) (((X, V)::LRemain)::Rest1)
< SS: case SS. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 V' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : mem (X, I) L1 RSB1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 LB : lookup L1 X V' SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ scopes_same (L::New) (((X, V)::LRemain)::Rest1)
< LA: apply SS1 to LB. Subgoal 2.1: Variables: X V New L Rest I Rest1 LRemain L1 V' IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsX : is_string X RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : mem (X, I) L1 RSB1 : remove_all L1 X LRemain H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest1 LB : lookup L1 X V' SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 LA : lookup L X V' ============================ scopes_same (L::New) (((X, V)::LRemain)::Rest1)
< apply no_lookup to RSA LA. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X SS : scopes_same (L::Rest) (L1::Rest1) RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New1 ============================ scopes_same (L::New) (L1::New1)
< SS: case SS. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsA : is_list (is_list (is_pair is_string is_value)) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 ============================ scopes_same (L::New) (L1::New1)
< case IsA. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsB : is_list (is_list (is_pair is_string is_value)) (L1::Rest1) IsX : is_string X RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ scopes_same (L::New) (L1::New1)
< case IsB. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsX : is_string X RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L1 H4 : is_list (is_list (is_pair is_string is_value)) Rest1 ============================ scopes_same (L::New) (L1::New1)
< apply IH to _ _ _ SS2 RSA1 RSB1. Subgoal 2.2: Variables: X V New L Rest New1 L1 Rest1 IH : forall A B X V A' B', is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> is_string X -> scopes_same A B -> replaceScopes X V A A' * -> replaceScopes X V B B' -> scopes_same A' B' IsX : is_string X RSA : no_lookup L X RSA1 : replaceScopes X V Rest New * RSB : no_lookup L1 X RSB1 : replaceScopes X V Rest1 New1 SS : forall X V, lookup L X V -> lookup L1 X V SS1 : forall X V, lookup L1 X V -> lookup L X V SS2 : scopes_same Rest Rest1 H1 : is_list (is_pair is_string is_value) L H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : is_list (is_pair is_string is_value) L1 H4 : is_list (is_list (is_pair is_string is_value)) Rest1 H5 : scopes_same New New1 ============================ scopes_same (L::New) (L1::New1)
< search. Proof completed.
< Theorem scopes_same_add_scope : forall A B, scopes_same A B -> scopes_same ([]::A) ([]::B). ============================ forall A B, scopes_same A B -> scopes_same ([]::A) ([]::B)
< intros SS. Variables: A B SS : scopes_same A B ============================ scopes_same ([]::A) ([]::B)
< unfold . Subgoal 1: Variables: A B SS : scopes_same A B ============================ forall X V, lookup [] X V -> lookup [] X V
< intros. Subgoal 1: Variables: A B X V SS : scopes_same A B H1 : lookup [] X V ============================ lookup [] X V
< search. Subgoal 2: Variables: A B SS : scopes_same A B ============================ forall X V, lookup [] X V -> lookup [] X V
< intros. Subgoal 2: Variables: A B X V SS : scopes_same A B H1 : lookup [] X V ============================ lookup [] X V
< search. Subgoal 3: Variables: A B SS : scopes_same A B ============================ scopes_same A B
< search. Proof completed.
< Extensible_Theorem evalExpr_scopes_same : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalExpr FE EE_A E VA EE_A' OA -> EvB : evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB on EvA as IH_E, evalExpr_scopes_same_ctx : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalExpr FE EE_A E VA EE_A' OA -> EvB : evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' on EvA as IH_E_C, evalStmt_scopes_same : forall S FE EE_A EE_A' OA EE_B EE_B' OB, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalStmt FE EE_A S EE_A' OA -> EvB : evalStmt FE EE_B S EE_B' OB -> OA = OB on EvA as IH_S, evalStmt_scopes_same_ctx : forall S FE EE_A EE_A' OA EE_B EE_B' OB, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalStmt FE EE_A S EE_A' OA -> EvB : evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' on EvA as IH_S_C, evalArgs_scopes_same : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalArgs FE EE_A A VA EE_A' OA -> EvB : evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB on EvA as IH_A, evalArgs_scopes_same_ctx : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalArgs FE EE_A A VA EE_A' OA -> EvB : evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' on EvA as IH_A_C, evalRecFields_scopes_same : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalRecFields FE EE_A RF VA EE_A' OA -> EvB : evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB on EvA as IH_RF, evalRecFields_scopes_same_ctx : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalRecFields FE EE_A RF VA EE_A' OA -> EvB : evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' on EvA as IH_RF_C. Subgoal 1.1: Variables: FE EE_A' EE_B VB EE_B' OB I IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' OB ============================ intVal I = VB /\ [] = OB
< case EvB. Subgoal 1.1: Variables: FE EE_A' EE_B' I IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ ============================ intVal I = intVal I /\ [] = []
< search. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB /\ OA = OB
< case IsE. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 + I5 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 + I5 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OB = OB
< apply plus_integer_unique to EvA3 EvB2. Subgoal 1.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I3) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 + I5 = I3 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3 /\ OB = OB
< search. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB /\ OA = OB
< case IsE. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 - I5 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.3: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 - I5 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OB = OB
< apply minus_integer_unique to EvA3 EvB2. Subgoal 1.3: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I3) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 - I5 = I3 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3 /\ OB = OB
< search. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB /\ OA = OB
< case IsE. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 * I5 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 * I5 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OB = OB
< apply multiply_integer_unique to EvA3 EvB2. Subgoal 1.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I3) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 * I5 = I3 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3 /\ OB = OB
< search. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB /\ OA = OB
< case IsE. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 / I5 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 / I5 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3 /\ OB = OB
< apply divide_integer_unique to EvA3 EvB2. Subgoal 1.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I3) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O4 * EvA3 : I4 / I5 = I3 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I3 = intVal I3 /\ OB = OB
< search. Subgoal 1.6: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' OB ============================ trueVal = VB /\ [] = OB
< case EvB. Subgoal 1.6: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ ============================ trueVal = trueVal /\ [] = []
< search. Subgoal 1.7: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' OB ============================ falseVal = VB /\ [] = OB
< case EvB. Subgoal 1.7: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ ============================ falseVal = falseVal /\ [] = []
< search. Subgoal 1.8: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ trueVal = VB /\ OA = OB
< case IsE. Subgoal 1.8: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.8.1: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OB = OB
< search. Subgoal 1.8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.9: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ falseVal = VB /\ OA = OB
< case IsE. Subgoal 1.9: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.9.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.9.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.9.2: Variables: FE EE_A EE_A' EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = falseVal /\ OB = OB
< search. Subgoal 1.9.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.10: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ falseVal = VB /\ OA = OB
< case IsE. Subgoal 1.10: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.10.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.10.3: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OB = OB
< search. Subgoal 1.11: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ trueVal = VB /\ OA = OB
< case IsE. Subgoal 1.11: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.11.1: Variables: FE EE_A EE_A' EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = trueVal /\ OB = OB
< search. Subgoal 1.11.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.11.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.12: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ trueVal = VB /\ OA = OB
< case IsE. Subgoal 1.12: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.12.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.12.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OB = OB
< search. Subgoal 1.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.13: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ falseVal = VB /\ OA = OB
< case IsE. Subgoal 1.13: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.13.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.13.3: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OB = OB
< search. Subgoal 1.14: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ trueVal = VB /\ OA = OB
< case IsE. Subgoal 1.14: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 ============================ trueVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.14.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.14.1: Variables: FE EE_A EE_A' EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ trueVal = trueVal /\ OB = OB
< search. Subgoal 1.14.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.15: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ falseVal = VB /\ OA = OB
< case IsE. Subgoal 1.15: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 ============================ falseVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.15.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.15.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.15.2: Variables: FE EE_A EE_A' EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ falseVal = falseVal /\ OB = OB
< search. Subgoal 1.16: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA ============================ trueVal = VB /\ OA = OB
< case IsE. Subgoal 1.16: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O4 * EvA3 : I3 > I4 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.16.1: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O4 * EvA3 : I3 > I4 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OB = OB
< search. Subgoal 1.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O4 * EvA3 : I3 > I4 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal /\ OA = OB
< apply greater_lesseq_integer_false to EvA3 EvB2. Subgoal 1.17: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA ============================ falseVal = VB /\ OA = OB
< case IsE. Subgoal 1.17: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O4 * EvA3 : I3 <= I4 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal /\ OA = OB
< apply greater_lesseq_integer_false to EvB2 EvA3. Subgoal 1.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O4 * EvA3 : I3 <= I4 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.17.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O4 * EvA3 : I3 <= I4 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OB = OB
< search. Subgoal 1.18: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ trueVal = VB /\ OA = OB
< case IsE. Subgoal 1.18: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.18.1: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = trueVal /\ OB = OB
< search. Subgoal 1.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ trueVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V2 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V2 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V2 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal /\ OA = OB
< apply EvB2 to _. Subgoal 1.19: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V1 EE1 O1 V2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA ============================ falseVal = VB /\ OA = OB
< case IsE. Subgoal 1.19: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V1 EE1 O1 V2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : V = V -> false EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal /\ OA = OB
< apply EvA3 to _. Subgoal 1.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V3 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ falseVal = falseVal /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V3 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V3 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = falseVal /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V3 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V4 EE_A' O4 * EvA3 : V3 = V4 -> false EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.19.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V4 EE_A' O4 * EvA3 : V3 = V4 -> false EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = falseVal /\ OB = OB
< search. Subgoal 1.20: Variables: FE EE_A' EE_B VB EE_B' OB S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' OB ============================ stringVal S = VB /\ [] = OB
< case EvB. Subgoal 1.20: Variables: FE EE_A' EE_B' S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ ============================ stringVal S = stringVal S /\ [] = []
< search. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA ============================ stringVal S = VB /\ OA = OB
< case IsE. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ stringVal S = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ stringVal S = stringVal S3 /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S4 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ stringVal S = stringVal S3 /\ OA = OB
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S4 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ stringVal S = stringVal S3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S4 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ stringVal S = stringVal S3 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S4 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S = stringVal S3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O4 * EvA3 : S4 ++ S5 = S EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S = stringVal S3 /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S3) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O4 * EvA3 : S4 ++ S5 = S3 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S3 = stringVal S3 /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.21: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S3) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O4 * EvA3 : S4 ++ S5 = S3 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S3 = stringVal S3 /\ OB = OB
< search. Subgoal 1.22: Variables: FE VA EE_A' EE_B VB EE_B' OB X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA ============================ VA = VB /\ [] = OB
< case IsE. Subgoal 1.22: Variables: FE VA EE_A' EE_B VB EE_B' OB X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA H1 : is_string X ============================ VA = VB /\ [] = OB
< EvB: case EvB. Subgoal 1.22: Variables: FE VA EE_A' VB EE_B' X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA H1 : is_string X EvB : lookupScopes X EE_B' VB ============================ VA = VB /\ [] = []
< apply scopes_same_lookupScopes to _ _ _ EvA1 EvB. Subgoal 1.22: Variables: FE EE_A' VB EE_B' X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (name X) VB EE_A' [] @ EvA1 : lookupScopes X EE_A' VB H1 : is_string X EvB : lookupScopes X EE_B' VB ============================ VB = VB /\ [] = []
< search. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB ============================ VA = VB /\ OA = OB
< apply lookup_unique to EvB EvA1. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB ============================ VA = VB /\ OA = OB
< apply IH_A to _ _ _ _ SS EvA2 EvB1. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB ============================ VA = VB /\ OA = OB
< apply zip_unique to EvA3 EvB2. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB ============================ VA = VB /\ OA = OB
< IsFP: apply lookup_is_value_funCtx to _ EvA1. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ VA = VB /\ OA = OB
< IsFP: case IsFP. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ VA = VB /\ OA = OB
< IsFP: case IsFP1. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ VA = VB /\ OA = OB
< IsFP: case IsFP2. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body ============================ VA = VB /\ OA = OB
< apply evalArgs_isValue to _ _ _ EvA2. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body H3 : is_list is_value ArgVals1 ============================ VA = VB /\ OA = OB
< apply zip_is to _ _ EvA3. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 ============================ VA = VB /\ OA = OB
< apply evalStmt_unique to _ _ _ EvA4 EvB3. Subgoal 1.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 * EvA5 : O3 ++ O4 = OA EvA6 : lookupScopes RetVar EE1 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 ============================ VA = VB /\ OA = OB
< apply lookupScopes_unique to EvA6 EvB5. Subgoal 1.23: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VB EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 * EvA5 : O3 ++ O4 = OA EvA6 : lookupScopes RetVar EE1 VB H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 ============================ VB = VB /\ OA = OB
< apply append_unique to EvA5 EvB4. Subgoal 1.23: Variables: FE EE_A EE_A' EE_B VB EE_B' OB RetVar RVVal ArgNames Body Args Fun ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VB EE_A' OB @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals1 EE_A' O3 * EvA3 : zip ArgNames ArgVals1 InitEnv1 EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 * EvA5 : O3 ++ O4 = OB EvA6 : lookupScopes RetVar EE1 VB H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body H3 : is_list is_value ArgVals1 H4 : is_list (is_pair is_string is_value) InitEnv1 ============================ VB = VB /\ OB = OB
< search. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 ============================ VA = VB /\ OA = OB
< SS': apply scopes_same_add_scope to SS. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_S to _ _ _ _ SS' EvA1 EvB. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_S_C to _ _ _ _ SS' EvA1 EvB. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ VA = VB /\ OA = OB
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB /\ OA = OB
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 1.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.24: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 Scope E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VB EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VB (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OA H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VB = VB /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.24: Variables: FE EE_A EE_A' EE_B VB EE_B' OB EE1 Scope E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VB EE_A' OB @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VB (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OB H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VB = VB /\ OB = OB
< search. Subgoal 1.25: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB VF RF IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * ============================ recVal VF = VB /\ OA = OB
< case IsE. Subgoal 1.25: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB VF RF IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF ============================ recVal VF = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.25: Variables: FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ recVal VF = recVal VF1 /\ OA = OB
< apply IH_RF to _ _ _ _ SS EvA1 EvB. Subgoal 1.25: Variables: FE EE_A EE_A' EE_B EE_B' OB RF VF1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF1) EE_A' OB @ EvA1 : evalRecFields FE EE_A RF VF1 EE_A' OB * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ recVal VF1 = recVal VF1 /\ OB = OB
< search. Subgoal 1.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.26: Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB F Rec Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OB @ EvA1 : evalExpr FE EE_A Rec (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ VA = VB /\ OB = OB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.26: Variables: FE EE_A EE_A' EE_B VB EE_B' OB F Rec Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VB EE_A' OB @ EvA1 : evalExpr FE EE_A Rec (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 F VB H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ VB = VB /\ OB = OB
< search. Subgoal 2.1: Variables: FE EE_A' EE_B VB EE_B' OB I IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 2.1: Variables: FE EE_A' EE_B' I IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.6: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 2.6: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.7: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 2.7: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.8: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.8: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.8.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.9: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.9: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.9.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.9.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.9.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.9.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.10: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.10: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.10.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.10.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.10.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.11: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.11: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.11.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.11.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 EE1 O1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.12: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.12: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.12.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.13: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.13: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.13.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.14: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.14: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.14.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.14.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.14.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.14.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.15: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.15: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.15.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.15.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.15.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.15.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.16: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.16: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.16.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.16.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.17: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.17: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB I1 EE1 O1 I2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.17.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.17.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.18: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.18: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V EE1 O1 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.18.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.18.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.19: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V1 EE1 O1 V2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.19: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V1 EE1 O1 V2 O2 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.19.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.19.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V3 EE2 O3 V4 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.20: Variables: FE EE_A' EE_B VB EE_B' OB S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 2.20: Variables: FE EE_A' EE_B' S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.21: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.22: Variables: FE VA EE_A' EE_B VB EE_B' OB X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 2.22: Variables: FE VA EE_A' VB EE_B' X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA H1 : lookupScopes X EE_B' VB ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB ============================ scopes_same EE_A' EE_B'
< apply IH_A_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.23: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same ([]::EE_A) ([]::EE_B) ============================ scopes_same EE_A' EE_B'
< apply IH_S_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same ([]::EE_A) ([]::EE_B) H4 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same ([]::EE_A) ([]::EE_B) H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same ([]::EE_A) ([]::EE_B) H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< SS': apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same ([]::EE_A) ([]::EE_B) H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 SS' : scopes_same (Scope::EE_A') (Scope1::EE_B') ============================ scopes_same EE_A' EE_B'
< case SS'. Subgoal 2.24: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same ([]::EE_A) ([]::EE_B) H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : forall X V, lookup Scope X V -> lookup Scope1 X V H8 : forall X V, lookup Scope1 X V -> lookup Scope X V H9 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.25: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB VF RF IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.25: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB VF RF IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.25: Variables: FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_RF_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.25: Variables: FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.26: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields F Rec Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 3.1: Variables: FE EE_A' EE_B EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalStmt FE EE_A' noop EE_A' [] @ EvB : evalStmt FE EE_B noop EE_B' OB ============================ [] = OB
< case EvB. Subgoal 3.1: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalStmt FE EE_A' noop EE_A' [] @ ============================ [] = []
< search. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvB : evalStmt FE EE_B (seq S1 S2) EE_B' OB EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvB : evalStmt FE EE_B (seq S1 S2) EE_B' OB EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 ============================ OA = OB
< EvB: case EvB. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_S_C to _ _ _ _ _ EvA1 EvB. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ OA = OB
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA1 EvB. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1. Subgoal 3.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 3.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OB @ EvA1 : evalStmt FE EE_A S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OB = OB
< search. Subgoal 3.3: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * ============================ OA = OB
< case IsS. Subgoal 3.3: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.3: Variables: FE EE_A OA EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.3: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB ============================ OB = OB
< search. Subgoal 3.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvB : evalStmt FE EE_B (assign X E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' ============================ OA = OB
< case IsS. Subgoal 3.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvB : evalStmt FE EE_B (assign X E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ OB = OB
< search. Subgoal 3.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ OA = OB
< case IsS. Subgoal 3.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ OB = OB
< search. Subgoal 3.6: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 3.6: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ OA = OB
< EvB: case EvB. Subgoal 3.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 3.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1. Subgoal 3.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 3.6.1: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 Scope El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OB @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OB = OB
< search. Subgoal 3.6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.7: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 3.7: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ OA = OB
< EvB: case EvB. Subgoal 3.7.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 3.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1. Subgoal 3.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 3.7.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 Scope El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OB @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OB = OB
< search. Subgoal 3.8: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA ============================ OA = OB
< case IsS. Subgoal 3.8: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body ============================ OA = OB
< EvB: case EvB. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB ============================ OA = OB
< SS1: apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 ============================ OA = OB
< SS1': apply scopes_same_add_scope to SS1. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ OA = OB
< SS2: apply IH_S_C to _ _ _ _ _ EvA2 EvB1. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2 : scopes_same (Scope::EE2) (Scope1::EE4) ============================ OA = OB
< SS2': case SS2. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 ============================ OA = OB
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ OA = OB
< case IsEE2+. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE4) ============================ OA = OB
< case IsEE4+. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_pair is_string is_value) Scope1 H8 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA3 EvB2. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O6 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_pair is_string is_value) Scope1 H8 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 3.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Scope EE2 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O7 EvA5 : O7 ++ O6 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_pair is_string is_value) Scope1 H8 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< apply append_unique to EvA5 EvB4. Subgoal 3.8.1: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 Scope EE2 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OB @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O7 EvA5 : O7 ++ O6 = OB H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 SS1' : scopes_same ([]::EE1) ([]::EE3) H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 SS2' : forall X V, lookup Scope X V -> lookup Scope1 X V SS2'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS2'2 : scopes_same EE2 EE4 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_pair is_string is_value) Scope1 H8 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OB = OB
< search. Subgoal 3.8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.9: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * ============================ OA = OB
< case IsS. Subgoal 3.9: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body ============================ OA = OB
< EvB: case EvB. Subgoal 3.9.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond EE1 O1 Scope EE2 O2 O3 O12 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE1 O1 EvB1 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB3 : O1 ++ O2 = O12 EvB4 : O12 ++ O3 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.9.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.9.2: Variables: FE EE_A EE_A' EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OB @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OB * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond falseVal EE_B' OB ============================ OB = OB
< search. Subgoal 3.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE EE_B (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * ============================ OA = OB
< case IsS. Subgoal 3.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE EE_B (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 ============================ OA = OB
< EvB: case EvB. Subgoal 3.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB ============================ OA = OB
< apply scopes_same_add_scope to SS. Subgoal 3.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB H2 : scopes_same ([]::EE_A) ([]::EE_B) ============================ OA = OB
< apply IH_S to _ _ _ _ _ EvA1 EvB. Subgoal 3.10: Variables: FE EE_A EE_A' EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OB @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OB * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB H2 : scopes_same ([]::EE_A) ([]::EE_B) ============================ OB = OB
< search. Subgoal 3.11: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA ============================ OA = OB
< case IsS. Subgoal 3.11: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E I1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E I1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I1) EE_A' O2 * EvA2 : O2 ++ [intVal I1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 3.11.1: Variables: FE EE_A EE_A' EE_B EE_B' OB E I1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OB @ EvA1 : evalExpr FE EE_A E (intVal I1) EE_A' O2 * EvA2 : O2 ++ [intVal I1] = OB H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OB = OB
< search. Subgoal 3.11.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.11.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.11.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E S1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.12: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA ============================ OA = OB
< case IsS. Subgoal 3.12: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.12.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E I O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 3.12.2: Variables: FE EE_A EE_A' EE_B EE_B' OB E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OB @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = OB H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OB = OB
< search. Subgoal 3.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.12.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E S1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.13: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA ============================ OA = OB
< case IsS. Subgoal 3.13: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.13.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E I O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 3.13.3: Variables: FE EE_A EE_A' EE_B EE_B' OB E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OB @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = OB H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OB = OB
< search. Subgoal 3.13.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E S1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.14: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA ============================ OA = OB
< case IsS. Subgoal 3.14: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.14.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E I O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.14.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.14.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.14.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E S2 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.14.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E S2 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S2) EE_A' O2 * EvA2 : O2 ++ [stringVal S2] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 3.14.4: Variables: FE EE_A EE_A' EE_B EE_B' OB E S2 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OB @ EvA1 : evalExpr FE EE_A E (stringVal S2) EE_A' O2 * EvA2 : O2 ++ [stringVal S2] = OB H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OB = OB
< search. Subgoal 4.1: Variables: FE EE_A' EE_B EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalStmt FE EE_A' noop EE_A' [] @ EvB : evalStmt FE EE_B noop EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 4.1: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalStmt FE EE_A' noop EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvB : evalStmt FE EE_B (seq S1 S2) EE_B' OB EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvB : evalStmt FE EE_B (seq S1 S2) EE_B' OB EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_S_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_S_C to _ _ _ _ _ EvA2 EvB1. Subgoal 4.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE EE_A S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 EvB : evalStmt FE EE_B S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.3: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * ============================ scopes_same (((X, V)::Scope)::EE1) EE_B'
< case IsS. Subgoal 4.3: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ scopes_same (((X, V)::Scope)::EE1) EE_B'
< EvB: case EvB. Subgoal 4.3: Variables: FE EE_A OA EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB ============================ scopes_same (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< SS': apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.3: Variables: FE EE_A OA EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : scopes_same (Scope::EE1) (Scope1::EE2) ============================ scopes_same (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.3: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : scopes_same (Scope::EE1) (Scope1::EE2) ============================ scopes_same (((X, V1)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< SS': case SS'. Subgoal 4.3: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ scopes_same (((X, V1)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< unfold . Subgoal 4.3.1: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ forall X1 V, lookup ((X, V1)::Scope) X1 V -> lookup ((X, V1)::Scope1) X1 V
< intros L. Subgoal 4.3.1: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : lookup ((X, V1)::Scope) X1 V2 ============================ lookup ((X, V1)::Scope1) X1 V2
< L: case L. Subgoal 4.3.1.1: Variables: FE EE_A EE_B OB EE1 Scope E Ty EE2 Scope1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X1 E) (((X1, V2)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V2 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E EvB : evalExpr FE EE_B E V2 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ lookup ((X1, V2)::Scope1) X1 V2
< search. Subgoal 4.3.1.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope X1 V2 ============================ lookup ((X, V1)::Scope1) X1 V2
< apply SS' to L1. Subgoal 4.3.1.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope X1 V2 H4 : lookup Scope1 X1 V2 ============================ lookup ((X, V1)::Scope1) X1 V2
< search. Subgoal 4.3.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ forall X1 V, lookup ((X, V1)::Scope1) X1 V -> lookup ((X, V1)::Scope) X1 V
< intros L. Subgoal 4.3.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : lookup ((X, V1)::Scope1) X1 V2 ============================ lookup ((X, V1)::Scope) X1 V2
< L: case L. Subgoal 4.3.2.1: Variables: FE EE_A EE_B OB EE1 Scope E Ty EE2 Scope1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X1 E) (((X1, V2)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V2 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X1 H3 : is_expr E EvB : evalExpr FE EE_B E V2 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ lookup ((X1, V2)::Scope) X1 V2
< search. Subgoal 4.3.2.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope1 X1 V2 ============================ lookup ((X, V1)::Scope) X1 V2
< apply SS'1 to L1. Subgoal 4.3.2.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 X1 V2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope1 X1 V2 H4 : lookup Scope X1 V2 ============================ lookup ((X, V1)::Scope) X1 V2
< search. Subgoal 4.3.3: Variables: FE EE_A EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ scopes_same EE1 EE2
< search. Subgoal 4.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvB : evalStmt FE EE_B (assign X E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvB : evalStmt FE EE_B (assign X E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA2 EvB1. Subgoal 4.4: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E X V1 EE2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.5: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 OA * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_lookupScopes to _ _ _ EvA2 EvB1. Subgoal 4.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals1) EvA3 : updateRecFields Fields V1 FieldVals1 NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply updateRecFields_unique to EvA3 EvB2. Subgoal 4.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals1) EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA4 EvB3. Subgoal 4.5: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 OB * EvA2 : lookupScopes Rec EE_A (recVal FieldVals1) EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V1 EE2 OB EvB1 : lookupScopes Rec EE_B (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.6: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.6: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< SS1: apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS1. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< SS2: apply IH_S_C to _ _ _ _ _ EvA2 EvB1. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 SS2 : scopes_same (Scope::EE_A') (Scope1::EE_B') ============================ scopes_same EE_A' EE_B'
< case SS2. Subgoal 4.6.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : forall X V, lookup Scope X V -> lookup Scope1 X V H8 : forall X V, lookup Scope1 X V -> lookup Scope X V H9 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.7: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.7: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.7.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< SS1: apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS1. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< SS2: apply IH_S_C to _ _ _ _ _ EvA2 EvB1. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 SS2 : scopes_same (Scope::EE_A') (Scope1::EE_B') ============================ scopes_same EE_A' EE_B'
< case SS2. Subgoal 4.7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond EE2 O3 Scope1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB : evalExpr FE EE_B Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB SS1 : scopes_same EE1 EE2 H4 : scopes_same ([]::EE1) ([]::EE2) H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : forall X V, lookup Scope X V -> lookup Scope1 X V H8 : forall X V, lookup Scope1 X V -> lookup Scope X V H9 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.8: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.8: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB ============================ scopes_same EE_A' EE_B'
< SS1: apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS1. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ scopes_same EE_A' EE_B'
< SS2: apply IH_S_C to _ _ _ _ _ EvA2 EvB1. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 SS2 : scopes_same (Scope::EE2) (Scope1::EE4) ============================ scopes_same EE_A' EE_B'
< case SS2. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : forall X V, lookup Scope X V -> lookup Scope1 X V H7 : forall X V, lookup Scope1 X V -> lookup Scope X V H8 : scopes_same EE2 EE4 ============================ scopes_same EE_A' EE_B'
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : forall X V, lookup Scope X V -> lookup Scope1 X V H7 : forall X V, lookup Scope1 X V -> lookup Scope X V H8 : scopes_same EE2 EE4 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ scopes_same EE_A' EE_B'
< case IsEE2+. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : forall X V, lookup Scope X V -> lookup Scope1 X V H7 : forall X V, lookup Scope1 X V -> lookup Scope X V H8 : scopes_same EE2 EE4 H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : forall X V, lookup Scope X V -> lookup Scope1 X V H7 : forall X V, lookup Scope1 X V -> lookup Scope X V H8 : scopes_same EE2 EE4 H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE2 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE4) ============================ scopes_same EE_A' EE_B'
< case IsEE4+. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : forall X V, lookup Scope X V -> lookup Scope1 X V H7 : forall X V, lookup Scope1 X V -> lookup Scope X V H8 : scopes_same EE2 EE4 H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE2 H11 : is_list (is_pair is_string is_value) Scope1 H12 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ scopes_same EE_A' EE_B'
< apply IH_S_C to _ _ _ _ _ EvA3 EvB2. Subgoal 4.8.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope1 EE4 O5 O6 O7 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope1::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB SS1 : scopes_same EE1 EE3 H3 : scopes_same ([]::EE1) ([]::EE3) H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : forall X V, lookup Scope X V -> lookup Scope1 X V H7 : forall X V, lookup Scope1 X V -> lookup Scope X V H8 : scopes_same EE2 EE4 H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE2 H11 : is_list (is_pair is_string is_value) Scope1 H12 : is_list (is_list (is_pair is_string is_value)) EE4 H13 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.9: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.9: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvB : evalStmt FE EE_B (while Cond Body) EE_B' OB EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.9.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond EE1 O1 Scope EE2 O2 O3 O12 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond trueVal EE1 O1 EvB1 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB3 : O1 ++ O2 = O12 EvB4 : O12 ++ O3 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.9.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond falseVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.9.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body Cond IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body EvB : evalExpr FE EE_B Cond falseVal EE_B' OB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE EE_B (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE EE_B (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS. Subgoal 4.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB H2 : scopes_same ([]::EE_A) ([]::EE_B) ============================ scopes_same EE_A' EE_B'
< SS': apply IH_S_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB H2 : scopes_same ([]::EE_A) ([]::EE_B) SS' : scopes_same (Scope::EE_A') (Scope1::EE_B') ============================ scopes_same EE_A' EE_B'
< case SS'. Subgoal 4.10: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') OA * H1 : is_stmt S1 EvB : evalStmt FE ([]::EE_B) S1 (Scope1::EE_B') OB H2 : scopes_same ([]::EE_A) ([]::EE_B) H3 : forall X V, lookup Scope X V -> lookup Scope1 X V H4 : forall X V, lookup Scope1 X V -> lookup Scope X V H5 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.11: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.11: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E I1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.11.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E I1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.11.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.11.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.11.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB I O1 E S1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.12: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.12: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.12.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E I O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.12.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.12.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.12.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E S1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.13: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.13: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.13.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E I O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.13.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.13.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.13.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 E S1 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.14: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.14: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvB : evalStmt FE EE_B (printVal E) EE_B' OB EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.14.1: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E I O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.14.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.14.3: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.14.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E S2 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.14.4: Variables: FE EE_A EE_A' OA EE_B EE_B' OB S1 O1 E S2 O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' OA @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E EvB : evalExpr FE EE_B E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 5.1: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' OB ============================ [] = VB /\ [] = OB
< case EvB. Subgoal 5.1: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ [] = [] /\ [] = []
< search. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ V::VRest = VB /\ OA = OB
< case IsA. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest ============================ V::VRest = VB /\ OA = OB
< EvB: case EvB. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ V::VRest = V1::VRest1 /\ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ V::VRest = V1::VRest1 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ V1::VRest = V1::VRest1 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ V1::VRest = V1::VRest1 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ V1::VRest = V1::VRest1 /\ OA = OB
< apply IH_A to _ _ _ _ _ EvA2 EvB1. Subgoal 5.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest1) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest1 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ V1::VRest1 = V1::VRest1 /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest1) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest1 EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ V1::VRest1 = V1::VRest1 /\ OB = OB
< search. Subgoal 6.1: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 6.1: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsA. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_A_C to _ _ _ _ _ EvA2 EvB1. Subgoal 6.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 7.1: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' OB ============================ [] = VB /\ [] = OB
< case EvB. Subgoal 7.1: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ ============================ [] = [] /\ [] = []
< search. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V F Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ (F, V)::VRest = VB /\ OA = OB
< case IsRF. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V F Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ (F, V)::VRest = VB /\ OA = OB
< EvB: case EvB. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ (F, V)::VRest = (F, V1)::VRest1 /\ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ (F, V)::VRest = (F, V1)::VRest1 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ (F, V1)::VRest = (F, V1)::VRest1 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ (F, V1)::VRest = (F, V1)::VRest1 /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V1)::VRest = (F, V1)::VRest1 /\ OA = OB
< apply IH_RF to _ _ _ _ _ EvA2 EvB1. Subgoal 7.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest1) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest1 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V1)::VRest1 = (F, V1)::VRest1 /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 7.2: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest1) EE_A' OB @ EvA1 : evalExpr FE EE_A E V1 EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest1 EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V1)::VRest1 = (F, V1)::VRest1 /\ OB = OB
< search. Subgoal 8.1: Variables: FE EE_A' EE_B VB EE_B' OB IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 8.1: Variables: FE EE_A' EE_B' IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V F Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsRF. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 VRest V F Rest E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_RF_C to _ _ _ _ _ EvA2 EvB1. Subgoal 8.2: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Proof completed.
< Extensible_Theorem evalExpr_scopes_same_exists : forall E FE EE_A V EE_A' O EE_B, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalExpr FE EE_A E V EE_A' O -> exists EE_B', evalExpr FE EE_B E V EE_B' O on EvA as IH_E, evalStmt_scopes_same_exists : forall S FE EE_A EE_A' O EE_B, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalStmt FE EE_A S EE_A' O -> exists EE_B', evalStmt FE EE_B S EE_B' O on EvA as IH_S, evalArgs_scopes_same_exists : forall A FE EE_A V EE_A' O EE_B, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalArgs FE EE_A A V EE_A' O -> exists EE_B', evalArgs FE EE_B A V EE_B' O on EvA as IH_A, evalRecFields_scopes_same_exists : forall RF FE EE_A V EE_A' O EE_B, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> EvA : evalRecFields FE EE_A RF V EE_A' O -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O on EvA as IH_RF. Subgoal 1.1: Variables: FE EE_A' EE_B I IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ ============================ exists EE_B', evalExpr FE EE_B (num I) (intVal I) EE_B' []
< search. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.2: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 + I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (plus E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.3: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 - I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (minus E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.4: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 * I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (mult E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< case IsE. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.5: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 I E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 / I2 = I EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (div E1 E2) (intVal I) EE_B' O
< search. Subgoal 1.6: Variables: FE EE_A' EE_B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ ============================ exists EE_B', evalExpr FE EE_B true trueVal EE_B' []
< search. Subgoal 1.7: Variables: FE EE_A' EE_B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ ============================ exists EE_B', evalExpr FE EE_B false falseVal EE_B' []
< search. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 trueVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) trueVal EE_B' O
< search. Subgoal 1.9: Variables: FE EE_A EE_A' O EE_B E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.9: Variables: FE EE_A EE_A' O EE_B E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.9: Variables: FE EE_A EE_A' O EE_B E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< search. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.10: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 falseVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (and E1 E2) falseVal EE_B' O
< search. Subgoal 1.11: Variables: FE EE_A EE_A' O EE_B E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.11: Variables: FE EE_A EE_A' O EE_B E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.11: Variables: FE EE_A EE_A' O EE_B E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< search. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.12: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 trueVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) trueVal EE_B' O
< search. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.13: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O2 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 falseVal EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (or E1 E2) falseVal EE_B' O
< search. Subgoal 1.14: Variables: FE EE_A EE_A' O EE_B E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< case IsE. Subgoal 1.14: Variables: FE EE_A EE_A' O EE_B E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.14: Variables: FE EE_A EE_A' O EE_B E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O * H1 : is_expr E1 EvB1 : evalExpr FE EE_B E1 falseVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (not E1) trueVal EE_B' O
< search. Subgoal 1.15: Variables: FE EE_A EE_A' O EE_B E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< case IsE. Subgoal 1.15: Variables: FE EE_A EE_A' O EE_B E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.15: Variables: FE EE_A EE_A' O EE_B E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O * H1 : is_expr E1 EvB1 : evalExpr FE EE_B E1 trueVal EE_B' O ============================ exists EE_B', evalExpr FE EE_B (not E1) falseVal EE_B' O
< search. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.16: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 > I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) trueVal EE_B' O
< search. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.17: Variables: FE EE_A EE_A' O EE_B I1 EE1 O2 I2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O3 * EvA3 : I1 <= I2 EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (intVal I1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (intVal I2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (greater E1 E2) falseVal EE_B' O
< search. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< case IsE. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.18: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 V1 EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) trueVal EE_B' O
< search. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< case IsE. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.19: Variables: FE EE_A EE_A' O EE_B V1 EE1 O2 V2 O3 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : V1 = V2 -> false EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 V2 EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (eq E1 E2) falseVal EE_B' O
< search. Subgoal 1.20: Variables: FE EE_A' EE_B S IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ ============================ exists EE_B', evalExpr FE EE_B (stringLit S) (stringVal S) EE_B' []
< search. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< case IsE. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.21: Variables: FE EE_A EE_A' O EE_B S1 EE1 O2 S2 O3 S E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' O @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O2 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O3 * EvA3 : S1 ++ S2 = S EvA4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 (stringVal S1) EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 (stringVal S2) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (appString E1 E2) (stringVal S) EE_B' O
< search. Subgoal 1.22: Variables: FE V EE_A' EE_B X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ EvA1 : lookupScopes X EE_A' V ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< case IsE. Subgoal 1.22: Variables: FE V EE_A' EE_B X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ EvA1 : lookupScopes X EE_A' V H1 : is_string X ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< apply scopes_same_lookupScopes_exists to _ _ SS EvA1. Subgoal 1.22: Variables: FE V EE_A' EE_B X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (name X) V EE_A' [] @ EvA1 : lookupScopes X EE_A' V H1 : is_string X H2 : lookupScopes X EE_B V ============================ exists EE_B', evalExpr FE EE_B (name X) V EE_B' []
< search. Subgoal 1.23: Variables: FE EE_A V EE_A' O EE_B RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< case IsE. Subgoal 1.23: Variables: FE EE_A V EE_A' O EE_B RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< EvB: apply IH_A to _ _ _ _ SS EvA2. Subgoal 1.23: Variables: FE EE_A V EE_A' O EE_B RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) V EE_A' O @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O2 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 * EvA5 : O2 ++ O3 = O EvA6 : lookupScopes RetVar EE2 V H1 : is_string Fun H2 : is_args Args EvB : evalArgs FE EE_B Args ArgVals EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (call Fun Args) V EE_B' O
< search. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< case IsE. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< SS': apply scopes_same_add_scope to SS. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< EvB1: apply IH_S to _ _ _ _ SS' EvA1. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< SS1: apply evalStmt_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 SS1 : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 SS1 : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 SS1 : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS1 EvA2. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 SS1 : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E1 V EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< SS2: apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA2 EvB2. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 SS1 : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E1 V EE_B'1 O3 SS2 : scopes_same (Scope::EE_A') EE_B'1 ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< case SS2. Subgoal 1.24: Variables: FE EE_A V EE_A' O EE_B EE1 O2 Scope O3 E1 S EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) V EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O2 * EvA2 : evalExpr FE EE1 E1 V (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB1 : evalStmt FE ([]::EE_B) S EE_B' O2 SS1 : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E1 V (B::BRest) O3 H5 : forall X V, lookup Scope X V -> lookup B X V H6 : forall X V, lookup B X V -> lookup Scope X V H7 : scopes_same EE_A' BRest ============================ exists EE_B', evalExpr FE EE_B (stmtExpr S E1) V EE_B' O
< search. Subgoal 1.25: Variables: FE EE_A EE_A' O EE_B VF RF IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ EvA1 : evalRecFields FE EE_A RF VF EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< case IsE. Subgoal 1.25: Variables: FE EE_A EE_A' O EE_B VF RF IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ EvA1 : evalRecFields FE EE_A RF VF EE_A' O * H1 : is_recFieldExprs RF ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< apply IH_RF to _ _ _ _ SS EvA1. Subgoal 1.25: Variables: FE EE_A EE_A' O EE_B VF RF EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' O @ EvA1 : evalRecFields FE EE_A RF VF EE_A' O * H1 : is_recFieldExprs RF H2 : evalRecFields FE EE_B RF VF EE_B' O ============================ exists EE_B', evalExpr FE EE_B (recBuild RF) (recVal VF) EE_B' O
< search. Subgoal 1.26: Variables: FE EE_A V EE_A' O EE_B Fields F Rec IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< case IsE. Subgoal 1.26: Variables: FE EE_A V EE_A' O EE_B Fields F Rec IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.26: Variables: FE EE_A V EE_A' O EE_B Fields F Rec EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) V EE_A' O @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' O * EvA2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : evalExpr FE EE_B Rec (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (recFieldAccess Rec F) V EE_B' O
< search. Subgoal 2.1: Variables: FE EE_A' EE_B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalStmt FE EE_A' noop EE_A' [] @ ============================ exists EE_B', evalStmt FE EE_B noop EE_B' []
< search. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< case IsS. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< EvB1: apply IH_S to _ _ _ _ SS EvA1. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvB1 : evalStmt FE EE_B S1 EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< SS': apply evalStmt_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvB1 : evalStmt FE EE_B S1 EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvB1 : evalStmt FE EE_B S1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvB1 : evalStmt FE EE_B S1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< apply IH_S to _ _ _ _ SS' EvA2. Subgoal 2.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 S2 S1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (seq S1 S2) EE_A' O @ EvA1 : evalStmt FE EE_A S1 EE1 O2 * EvA2 : evalStmt FE EE1 S2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 EvB1 : evalStmt FE EE_B S1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : evalStmt FE EE_B' S2 EE_B'1 O3 ============================ exists EE_B', evalStmt FE EE_B (seq S1 S2) EE_B' O
< search. Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< case IsS. Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< EvB: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB. Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same (Scope::EE1) EE_B' ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< case SS' (keep). Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V (B::BRest) O SS' : scopes_same (Scope::EE1) (B::BRest) H4 : forall X V, lookup Scope X V -> lookup B X V H5 : forall X V, lookup B X V -> lookup Scope X V H6 : scopes_same EE1 BRest ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V (B::BRest) O SS' : scopes_same (Scope::EE1) (B::BRest) H4 : forall X V, lookup Scope X V -> lookup B X V H5 : forall X V, lookup B X V -> lookup Scope X V H6 : scopes_same EE1 BRest H7 : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.3: Variables: FE EE_A O EE_B EE1 Scope V X E Ty BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (declare Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E EvB : evalExpr FE EE_B E V (B::BRest) O SS' : scopes_same (Scope::EE1) (B::BRest) H4 : forall X V, lookup Scope X V -> lookup B X V H5 : forall X V, lookup B X V -> lookup Scope X V H6 : scopes_same EE1 BRest H7 : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) H8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) ============================ exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< search. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< case IsS. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< EvB: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< apply scopes_same_replaceScopes_exists to _ _ _ SS' EvA2. Subgoal 2.4: Variables: FE EE_A EE_A' O EE_B V EE1 E X EE_B' B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assign X E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' H5 : replaceScopes X V EE_B' B' ============================ exists EE_B', evalStmt FE EE_B (assign X E) EE_B' O
< search. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< case IsS. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< EvB: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< apply scopes_same_replaceScopes_exists to _ _ _ SS' EvA4. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec EE_B' B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : replaceScopes Rec (recVal NewVals) EE_B' B' ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< apply scopes_same_lookupScopes_exists to _ _ SS EvA2. Subgoal 2.5: Variables: FE EE_A EE_A' O EE_B V EE1 FieldVals NewVals E Fields Rec EE_B' B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (recUpdate Rec Fields E) EE_A' O @ EvA1 : evalExpr FE EE_A E V EE1 O * EvA2 : lookupScopes Rec EE_A (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : replaceScopes Rec (recVal NewVals) EE_B' B' H7 : lookupScopes Rec EE_B (recVal FieldVals) ============================ exists EE_B', evalStmt FE EE_B (recUpdate Rec Fields E) EE_B' O
< search. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< case IsS. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< SS1: apply scopes_same_add_scope to SS'. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< EvB2: apply IH_S to _ _ _ _ SS1 EvA2. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Th EE_B'1 O3 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< SS2: apply evalStmt_scopes_same_ctx to _ _ _ _ _ EvA2 EvB2. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Th EE_B'1 O3 SS2 : scopes_same (Scope::EE_A') EE_B'1 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< case SS2. Subgoal 2.6: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Th (B::BRest) O3 H6 : forall X V, lookup Scope X V -> lookup B X V H7 : forall X V, lookup B X V -> lookup Scope X V H8 : scopes_same EE_A' BRest ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< search. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< case IsS. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< SS1: apply scopes_same_add_scope to SS'. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< EvB2: apply IH_S to _ _ _ _ SS1 EvA2. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') El EE_B'1 O3 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< SS2: apply evalStmt_scopes_same_ctx to _ _ _ _ _ EvA2 EvB2. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') El EE_B'1 O3 SS2 : scopes_same (Scope::EE_A') EE_B'1 ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< case SS2. Subgoal 2.7: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope O3 El Th Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (ifThenElse Cond Th El) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O3 * EvA3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El EvB1 : evalExpr FE EE_B Cond falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') El (B::BRest) O3 H6 : forall X V, lookup Scope X V -> lookup B X V H7 : forall X V, lookup B X V -> lookup Scope X V H8 : scopes_same EE_A' BRest ============================ exists EE_B', evalStmt FE EE_B (ifThenElse Cond Th El) EE_B' O
< search. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< case IsS. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< SS1: apply scopes_same_add_scope to SS'. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< EvB2: apply IH_S to _ _ _ _ SS1 EvA2. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body EE_B'1 O3 ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< SS2: apply evalStmt_scopes_same_ctx to _ _ _ _ _ EvA2 EvB2. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body EE_B'1 O3 SS2 : scopes_same (Scope::EE2) EE_B'1 ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< SS2': case SS2. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body (B::BRest) O3 SS2' : forall X V, lookup Scope X V -> lookup B X V SS2'1 : forall X V, lookup B X V -> lookup Scope X V SS2'2 : scopes_same EE2 BRest ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body (B::BRest) O3 SS2' : forall X V, lookup Scope X V -> lookup B X V SS2'1 : forall X V, lookup B X V -> lookup Scope X V SS2'2 : scopes_same EE2 BRest IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< IsBR+: apply evalStmt_isCtx to _ _ _ EvB2. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body (B::BRest) O3 SS2' : forall X V, lookup Scope X V -> lookup B X V SS2'1 : forall X V, lookup B X V -> lookup Scope X V SS2'2 : scopes_same EE2 BRest IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) IsBR+ : is_list (is_list (is_pair is_string is_value)) (B::BRest) ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< case IsEE2+. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body (B::BRest) O3 SS2' : forall X V, lookup Scope X V -> lookup B X V SS2'1 : forall X V, lookup B X V -> lookup Scope X V SS2'2 : scopes_same EE2 BRest IsBR+ : is_list (is_list (is_pair is_string is_value)) (B::BRest) H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< case IsBR+. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body (B::BRest) O3 SS2' : forall X V, lookup Scope X V -> lookup B X V SS2'1 : forall X V, lookup B X V -> lookup Scope X V SS2'2 : scopes_same EE2 BRest H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_pair is_string is_value) B H8 : is_list (is_list (is_pair is_string is_value)) BRest ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< apply IH_S to _ _ _ _ SS2'2 EvA3. Subgoal 2.8: Variables: FE EE_A EE_A' O EE_B EE1 O2 Scope EE2 O3 O4 O12 Body Cond EE_B' BRest B EE_B'2 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond trueVal EE1 O2 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O3 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O4 * EvA4 : O2 ++ O3 = O12 EvA5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body EvB1 : evalExpr FE EE_B Cond trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS1 : scopes_same ([]::EE1) ([]::EE_B') EvB2 : evalStmt FE ([]::EE_B') Body (B::BRest) O3 SS2' : forall X V, lookup Scope X V -> lookup B X V SS2'1 : forall X V, lookup B X V -> lookup Scope X V SS2'2 : scopes_same EE2 BRest H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_pair is_string is_value) B H8 : is_list (is_list (is_pair is_string is_value)) BRest H9 : evalStmt FE BRest (while Cond Body) EE_B'2 O4 ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< search. Subgoal 2.9: Variables: FE EE_A EE_A' O EE_B Body Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' O * ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< case IsS. Subgoal 2.9: Variables: FE EE_A EE_A' O EE_B Body Cond IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' O * H1 : is_expr Cond H2 : is_stmt Body ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.9: Variables: FE EE_A EE_A' O EE_B Body Cond EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (while Cond Body) EE_A' O @ EvA1 : evalExpr FE EE_A Cond falseVal EE_A' O * H1 : is_expr Cond H2 : is_stmt Body H3 : evalExpr FE EE_B Cond falseVal EE_B' O ============================ exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< search. Subgoal 2.10: Variables: FE EE_A EE_A' O EE_B Scope S1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') O * ============================ exists EE_B', evalStmt FE EE_B (scopeStmt S1) EE_B' O
< case IsS. Subgoal 2.10: Variables: FE EE_A EE_A' O EE_B Scope S1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') O * H1 : is_stmt S1 ============================ exists EE_B', evalStmt FE EE_B (scopeStmt S1) EE_B' O
< SS': apply scopes_same_add_scope to SS. Subgoal 2.10: Variables: FE EE_A EE_A' O EE_B Scope S1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') O * H1 : is_stmt S1 SS' : scopes_same ([]::EE_A) ([]::EE_B) ============================ exists EE_B', evalStmt FE EE_B (scopeStmt S1) EE_B' O
< EvB: apply IH_S to _ _ _ _ SS' EvA1. Subgoal 2.10: Variables: FE EE_A EE_A' O EE_B Scope S1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') O * H1 : is_stmt S1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S1 EE_B' O ============================ exists EE_B', evalStmt FE EE_B (scopeStmt S1) EE_B' O
< SS'': apply evalStmt_scopes_same_ctx to _ _ _ _ _ EvA1 EvB. Subgoal 2.10: Variables: FE EE_A EE_A' O EE_B Scope S1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') O * H1 : is_stmt S1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S1 EE_B' O SS'' : scopes_same (Scope::EE_A') EE_B' ============================ exists EE_B', evalStmt FE EE_B (scopeStmt S1) EE_B' O
< case SS''. Subgoal 2.10: Variables: FE EE_A EE_A' O EE_B Scope S1 BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (scopeStmt S1) EE_A' O @ EvA1 : evalStmt FE ([]::EE_A) S1 (Scope::EE_A') O * H1 : is_stmt S1 SS' : scopes_same ([]::EE_A) ([]::EE_B) EvB : evalStmt FE ([]::EE_B) S1 (B::BRest) O H2 : forall X V, lookup Scope X V -> lookup B X V H3 : forall X V, lookup B X V -> lookup Scope X V H4 : scopes_same EE_A' BRest ============================ exists EE_B', evalStmt FE EE_B (scopeStmt S1) EE_B' O
< search. Subgoal 2.11: Variables: FE EE_A EE_A' O EE_B I O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< case IsS. Subgoal 2.11: Variables: FE EE_A EE_A' O EE_B I O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.11: Variables: FE EE_A EE_A' O EE_B I O2 E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : evalExpr FE EE_B E (intVal I) EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search. Subgoal 2.12: Variables: FE EE_A EE_A' O EE_B O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< case IsS. Subgoal 2.12: Variables: FE EE_A EE_A' O EE_B O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.12: Variables: FE EE_A EE_A' O EE_B O2 E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : evalExpr FE EE_B E trueVal EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search. Subgoal 2.13: Variables: FE EE_A EE_A' O EE_B O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< case IsS. Subgoal 2.13: Variables: FE EE_A EE_A' O EE_B O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.13: Variables: FE EE_A EE_A' O EE_B O2 E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : evalExpr FE EE_B E falseVal EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search. Subgoal 2.14: Variables: FE EE_A EE_A' O EE_B S1 O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< case IsS. Subgoal 2.14: Variables: FE EE_A EE_A' O EE_B S1 O2 E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.14: Variables: FE EE_A EE_A' O EE_B S1 O2 E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (printVal E) EE_A' O @ EvA1 : evalExpr FE EE_A E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : evalExpr FE EE_B E (stringVal S1) EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search. Subgoal 3.1: Variables: FE EE_A' EE_B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ exists EE_B', evalArgs FE EE_B nilArgs [] EE_B' []
< search. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< case IsA. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< apply IH_A to _ _ _ _ SS' EvA2. Subgoal 3.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 Rest E EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA1 : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' SS' : scopes_same EE1 EE_B' H5 : evalArgs FE EE_B' Rest VRest EE_B'1 O3 ============================ exists EE_B', evalArgs FE EE_B (consArgs E Rest) (V1::VRest) EE_B' O
< search. Subgoal 4.1: Variables: FE EE_A' EE_B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ ============================ exists EE_B', evalRecFields FE EE_B nilRecFieldExprs [] EE_B' []
< search. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< case IsRF. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< apply IH_RF to _ _ _ _ SS' EvA2. Subgoal 4.2: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 VRest V1 F Rest E EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' O @ EvA1 : evalExpr FE EE_A E V1 EE1 O2 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest EvB1 : evalExpr FE EE_B E V1 EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' SS' : scopes_same EE1 EE_B' H6 : evalRecFields FE EE_B' Rest VRest EE_B'1 O3 ============================ exists EE_B', evalRecFields FE EE_B (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_B' O
< search. Proof completed.
< Projection_Constraint proj_evalExpr_forward : forall Names E E' FE EE V EE' O, Pr : Names |{expr}- E ~~> E' -> Names : names EE Names -> IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalExpr FE EE E V EE' O -> exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''. Proof completed.
< Projection_Constraint proj_evalExpr_backward : forall Names E E' FE EE V EE' O Ctx, Pr : Names |{expr}- E ~~> E' -> Names : names EE Names -> IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> EN : exprNames Ctx E [] -> Ev : evalExpr FE EE E' V EE' O -> exists EE'', evalExpr FE EE E V EE'' O /\ scopes_same EE' EE''. Proof completed.
< Projection_Constraint proj_evalStmt_forward : forall Names S S' FE EE EE' O, Pr : Names |{stmt}- S ~~> S' -> Names : names EE Names -> IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalStmt FE EE S EE' O -> exists EE'', evalStmt FE EE S' EE'' O /\ scopes_same EE' EE''. Proof completed.
< Projection_Constraint proj_evalStmt_backward : forall Names S S' FE EE EE' O Ctx Ctx', Pr : Names |{stmt}- S ~~> S' -> Names : names EE Names -> IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> SN : stmtNames Ctx S [] Ctx' -> Ev : evalStmt FE EE S' EE' O -> exists EE'', evalStmt FE EE S EE'' O /\ scopes_same EE' EE''. Proof completed.
< Ext_Ind forall FE EE E V EE' O, evalExpr FE EE E V EE' O with IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE, IsEE : is_list (is_list (is_pair is_string is_value)) EE, IsE : is_expr E; forall FE EE A V EE' O, evalArgs FE EE A V EE' O with IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE, IsEE : is_list (is_list (is_pair is_string is_value)) EE, IsA : is_args A; forall FE EE RF V EE' O, evalRecFields FE EE RF V EE' O with IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE, IsEE : is_list (is_list (is_pair is_string is_value)) EE, IsRF : is_recFieldExprs RF; forall FE EE S EE' O, evalStmt FE EE S EE' O with IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE, IsEE : is_list (is_list (is_pair is_string is_value)) EE, IsS : is_stmt S. Subgoal 1.1: Variables: FE EE' I IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE' (num I) (intVal I) EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (num I) ============================ <evalExpr {P}> FE EE' (num I) (intVal I) EE' []
< search. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< Acc': case Acc (keep). Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (plus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< Is: case IsE. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.2: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< LN2: case OrN2. Subgoal 1.2.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.2.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.2.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.2.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.2.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.2.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.2.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.2.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< search. Subgoal 1.2.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.2.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< search. Subgoal 1.2.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.2.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.2.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.2.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.2.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.2.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.2.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< search. Subgoal 1.2.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.2.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (plus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 + I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (plus E1 E2) (intVal I) EE' O
< search. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< Acc': case Acc (keep). Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (minus E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< Is: case IsE. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.3: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< LN2: case OrN2. Subgoal 1.3.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.3.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.3.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.3.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.3.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.3.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.3.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.3.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< search. Subgoal 1.3.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.3.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< search. Subgoal 1.3.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.3.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.3.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.3.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.3.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.3.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.3.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< search. Subgoal 1.3.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.3.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (minus E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 - I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (minus E1 E2) (intVal I) EE' O
< search. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< Acc': case Acc (keep). Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (mult E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< Is: case IsE. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.4: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< LN2: case OrN2. Subgoal 1.4.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.4.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.4.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.4.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.4.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.4.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.4.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.4.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< search. Subgoal 1.4.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.4.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< search. Subgoal 1.4.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.4.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.4.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.4.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.4.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.4.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.4.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< search. Subgoal 1.4.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.4.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (mult E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 * I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (mult E1 E2) (intVal I) EE' O
< search. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< Acc': case Acc (keep). Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (div E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< Is: case IsE. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.5: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< LN2: case OrN2. Subgoal 1.5.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.5.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.5.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.5.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.5.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.5.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.5.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.5.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< search. Subgoal 1.5.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.5.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< search. Subgoal 1.5.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.5.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.5.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.5.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< LN3: case OrN3. Subgoal 1.5.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.5.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.5.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< search. Subgoal 1.5.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.5.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (div E1 E2) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 / I2 = I R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (div E1 E2) (intVal I) EE' O
< search. Subgoal 1.6: Variables: FE EE' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE' true trueVal EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr true ============================ <evalExpr {P}> FE EE' true trueVal EE' []
< search. Subgoal 1.7: Variables: FE EE' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE' false falseVal EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr false ============================ <evalExpr {P}> FE EE' false falseVal EE' []
< search. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< Acc': case Acc (keep). Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< Is: case IsE. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.8: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< LN2: case OrN2. Subgoal 1.8.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.8.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.8.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.8.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.8.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.8.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.8.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.8.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< search. Subgoal 1.8.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.8.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< search. Subgoal 1.8.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.8.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.8.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.8.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.8.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.8.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.8.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< search. Subgoal 1.8.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.8.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) trueVal EE' O
< search. Subgoal 1.9: Variables: N FE EE EE' O E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : <evalExpr {ES}> FE EE E1 falseVal EE' O N ** ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< case IsE. Subgoal 1.9: Variables: N FE EE EE' O E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 falseVal EE' O N ** H1 : is_expr E1 H2 : is_expr E2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 1.9: Variables: N FE EE EE' O E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 falseVal EE' O N ** H1 : is_expr E1 H2 : is_expr E2 H3 : <evalExpr {P}> FE EE E1 falseVal EE' O ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< search. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< Acc': case Acc (keep). Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (and E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< Is: case IsE. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.10: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< LN2: case OrN2. Subgoal 1.10.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.10.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.10.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.10.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.10.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.10.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.10.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.10.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< search. Subgoal 1.10.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.10.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< search. Subgoal 1.10.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.10.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.10.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.10.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.10.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.10.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.10.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< search. Subgoal 1.10.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.10.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (and E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 trueVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 trueVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 trueVal EE3 O2 Ev : evalExpr FE EE E1 trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (and E1 E2) falseVal EE' O
< search. Subgoal 1.11: Variables: N FE EE EE' O E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : <evalExpr {ES}> FE EE E1 trueVal EE' O N ** ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< case IsE. Subgoal 1.11: Variables: N FE EE EE' O E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 trueVal EE' O N ** H1 : is_expr E1 H2 : is_expr E2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 1.11: Variables: N FE EE EE' O E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 trueVal EE' O N ** H1 : is_expr E1 H2 : is_expr E2 H3 : <evalExpr {P}> FE EE E1 trueVal EE' O ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< search. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< Acc': case Acc (keep). Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< Is: case IsE. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.12: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< LN2: case OrN2. Subgoal 1.12.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.12.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.12.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.12.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.12.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.12.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.12.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.12.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< search. Subgoal 1.12.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.12.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< search. Subgoal 1.12.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.12.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.12.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.12.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.12.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.12.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.12.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< search. Subgoal 1.12.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.12.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 trueVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 trueVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) trueVal EE' O
< search. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< Acc': case Acc (keep). Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (or E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< Is: case IsE. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.13: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< LN2: case OrN2. Subgoal 1.13.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.13.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.13.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.13.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.13.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.13.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.13.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.13.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< search. Subgoal 1.13.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.13.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< search. Subgoal 1.13.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.13.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.13.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.13.2: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.13.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.13.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.13.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< search. Subgoal 1.13.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.13.2.2: Variables: N FE EE EE' O EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (or E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 falseVal EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 falseVal EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 falseVal EE3 O2 H2 : <evalExpr {P}> FE EE E1 falseVal EE3 O2 Ev : evalExpr FE EE E1 falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 falseVal EE' O3 ============================ <evalExpr {P}> FE EE (or E1 E2) falseVal EE' O
< search. Subgoal 1.14: Variables: N FE EE EE' O E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (not E1) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (not E1) R1 : <evalExpr {ES}> FE EE E1 falseVal EE' O N ** ============================ <evalExpr {P}> FE EE (not E1) trueVal EE' O
< case IsE. Subgoal 1.14: Variables: N FE EE EE' O E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (not E1) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 falseVal EE' O N ** H1 : is_expr E1 ============================ <evalExpr {P}> FE EE (not E1) trueVal EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 1.14: Variables: N FE EE EE' O E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (not E1) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 falseVal EE' O N ** H1 : is_expr E1 H2 : <evalExpr {P}> FE EE E1 falseVal EE' O ============================ <evalExpr {P}> FE EE (not E1) trueVal EE' O
< search. Subgoal 1.15: Variables: N FE EE EE' O E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (not E1) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (not E1) R1 : <evalExpr {ES}> FE EE E1 trueVal EE' O N ** ============================ <evalExpr {P}> FE EE (not E1) falseVal EE' O
< case IsE. Subgoal 1.15: Variables: N FE EE EE' O E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (not E1) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 trueVal EE' O N ** H1 : is_expr E1 ============================ <evalExpr {P}> FE EE (not E1) falseVal EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 1.15: Variables: N FE EE EE' O E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (not E1) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E1 trueVal EE' O N ** H1 : is_expr E1 H2 : <evalExpr {P}> FE EE E1 trueVal EE' O ============================ <evalExpr {P}> FE EE (not E1) falseVal EE' O
< search. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< Acc': case Acc (keep). Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< Is: case IsE. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.16: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< LN2: case OrN2. Subgoal 1.16.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.16.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.16.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.16.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.16.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.16.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.16.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.16.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< search. Subgoal 1.16.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.16.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< search. Subgoal 1.16.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.16.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.16.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.16.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.16.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.16.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.16.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< search. Subgoal 1.16.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.16.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 > I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) trueVal EE' O
< search. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< Acc': case Acc (keep). Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (greater E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< Is: case IsE. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.17: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< LN2: case OrN2. Subgoal 1.17.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.17.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.17.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.17.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.17.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.17.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.17.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.17.1.1: Variables: N FE EE EE' O N2 N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< search. Subgoal 1.17.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.17.1.2: Variables: N FE EE EE' O N2 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< search. Subgoal 1.17.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.17.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.17.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.17.2: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.17.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.17.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.17.2.1: Variables: N FE EE EE' O N3 I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N3 ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< search. Subgoal 1.17.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.17.2.2: Variables: N FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (greater E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (intVal I1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (intVal I2) EE' O3 N ** R4 : I1 <= I2 R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (intVal I1) EE3 O2 Ev : evalExpr FE EE E1 (intVal I1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (intVal I2) EE' O3 ============================ <evalExpr {P}> FE EE (greater E1 E2) falseVal EE' O
< search. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< Acc': case Acc (keep). Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< Is: case IsE. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.18: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< LN2: case OrN2. Subgoal 1.18.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.18.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.18.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.18.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.18.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.18.1.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.18.1.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.18.1.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 V1 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< search. Subgoal 1.18.1.2: Variables: N FE EE EE' O N2 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.18.1.2: Variables: N FE EE EE' O N2 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 V1 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< search. Subgoal 1.18.2: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.18.2: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.18.2: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.18.2: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< LN3: case OrN3. Subgoal 1.18.2.1: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.18.2.1: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.18.2.1: Variables: N FE EE EE' O N3 V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 V1 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< search. Subgoal 1.18.2.2: Variables: N FE EE EE' O V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.18.2.2: Variables: N FE EE EE' O V1 EE3 O2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) trueVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V1 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 V1 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) trueVal EE' O
< search. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< Acc': case Acc (keep). Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (eq E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< Is: case IsE. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.19: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< LN2: case OrN2. Subgoal 1.19.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.19.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.19.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.19.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.19.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.19.1.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.19.1.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.19.1.1: Variables: N FE EE EE' O N2 N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< search. Subgoal 1.19.1.2: Variables: N FE EE EE' O N2 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.19.1.2: Variables: N FE EE EE' O N2 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< search. Subgoal 1.19.2: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.19.2: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.19.2: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.19.2: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< LN3: case OrN3. Subgoal 1.19.2.1: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.19.2.1: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.19.2.1: Variables: N FE EE EE' O N3 V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< search. Subgoal 1.19.2.2: Variables: N FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.19.2.2: Variables: N FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (eq E1 E2) falseVal EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N ** R4 : V1 = V2 -> false R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H2 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev : evalExpr FE EE E1 V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (eq E1 E2) falseVal EE' O
< search. Subgoal 1.20: Variables: FE EE' S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE' (stringLit S) (stringVal S) EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (stringLit S) ============================ <evalExpr {P}> FE EE' (stringLit S) (stringVal S) EE' []
< search. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< Acc': case Acc (keep). Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (appString E1 E2) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< Is: case IsE. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 1.21: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< LN2: case OrN2. Subgoal 1.21.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.21.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 1.21.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.21.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.21.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< LN3: case OrN3. Subgoal 1.21.1.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.21.1.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.21.1.1: Variables: N FE EE EE' O N2 N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (stringVal S2) EE' O3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< search. Subgoal 1.21.1.2: Variables: N FE EE EE' O N2 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.21.1.2: Variables: N FE EE EE' O N2 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (stringVal S2) EE' O3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< search. Subgoal 1.21.2: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 1.21.2: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.21.2: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.21.2: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< LN3: case OrN3. Subgoal 1.21.2.1: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.21.2.1: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.21.2.1: Variables: N FE EE EE' O N3 S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N3 ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E2 (stringVal S2) EE' O3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< search. Subgoal 1.21.2.2: Variables: N FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.21.2.2: Variables: N FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (appString E1 E2) (stringVal S) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E1 (stringVal S1) EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E2 (stringVal S2) EE' O3 N ** R4 : S1 ++ S2 = S R5 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E1 Is1 : is_expr E2 Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 H2 : <evalExpr {P}> FE EE E1 (stringVal S1) EE3 O2 Ev : evalExpr FE EE E1 (stringVal S1) EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E2 (stringVal S2) EE' O3 ============================ <evalExpr {P}> FE EE (appString E1 E2) (stringVal S) EE' O
< search. Subgoal 1.22: Variables: FE V EE' X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE' (name X) V EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (name X) R1 : lookupScopes X EE' V ============================ <evalExpr {P}> FE EE' (name X) V EE' []
< search. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< Acc': case Acc (keep). Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< LE_N2: apply ext_size_pos_evalArgs to R3. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< LE_N3: apply ext_size_pos_evalStmt to R5. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply ext_size_is_int_evalStmt to R5. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (call Fun Args) R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< Is: case IsE. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< IsFP: apply lookup_is_value_funCtx to _ R2. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< IsFP: case IsFP. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< IsFP: case IsFP1. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< IsFP: case IsFP2. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< EvA: apply drop_ext_size_evalArgs to R3. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply evalArgs_isValue to _ _ _ EvA. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply zip_is to _ _ R4. Subgoal 1.23: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< LN2: case OrN2. Subgoal 1.23.1: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.23.1: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply IH5 to R3 A2 _ _ _. Subgoal 1.23.1: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< LN3: case OrN3. Subgoal 1.23.1.1: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.23.1.1: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply IH7 to R5 A3 _ _ _. Subgoal 1.23.1.1: Variables: N FE EE V EE' O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 LN3 : N3 < N A3 : acc N3 * H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< search. Subgoal 1.23.1.2: Variables: N FE EE V EE' O N2 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply IH7 to R5 Acc _ _ _. Subgoal 1.23.1.2: Variables: N FE EE V EE' O N2 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N2 ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv LN2 : N2 < N A2 : acc N2 * H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< search. Subgoal 1.23.2: Variables: N FE EE V EE' O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply IH5 to R3 Acc _ _ _. Subgoal 1.23.2: Variables: N FE EE V EE' O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< LN3: case OrN3. Subgoal 1.23.2.1: Variables: N FE EE V EE' O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.23.2.1: Variables: N FE EE V EE' O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply IH7 to R5 A3 _ _ _. Subgoal 1.23.2.1: Variables: N FE EE V EE' O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N3 ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 LN3 : N3 < N A3 : acc N3 * H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< search. Subgoal 1.23.2.2: Variables: N FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< apply IH7 to R5 Acc _ _ _. Subgoal 1.23.2.2: Variables: N FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (call Fun Args) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) R3 : <evalArgs {ES}> FE EE Args ArgVals EE' O2 N ** R4 : zip ArgNames ArgVals InitEnv R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 N ** R6 : O2 ++ O3 = O R7 : lookupScopes RetVar EE3 V Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_string Fun Is1 : is_args Args IsFP : is_string RetVar IsFP1 : is_value RVVal IsFP2 : is_list is_string ArgNames IsFP3 : is_stmt Body EvA : evalArgs FE EE Args ArgVals EE' O2 H2 : is_list is_value ArgVals H3 : is_list (is_pair is_string is_value) InitEnv H4 : <evalArgs {P}> FE EE Args ArgVals EE' O2 H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 ============================ <evalExpr {P}> FE EE (call Fun Args) V EE' O
< search. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< Acc': case Acc (keep). Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< LE_N2: apply ext_size_pos_evalStmt to R2. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< LE_N3: apply ext_size_pos_evalExpr to R3. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (stmtExpr S E1) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< Is: case IsE. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< Ev1: apply drop_ext_size_evalStmt to R2. Subgoal 1.24: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< LN2: case OrN2. Subgoal 1.24.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< A2: apply Acc' to _ LN2. Subgoal 1.24.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply IH7 to R2 A2 _ _ _. Subgoal 1.24.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< Ev: apply drop_ext_size_evalStmt to R2. Subgoal 1.24.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply evalStmt_isCtx to _ _ _ Ev. Subgoal 1.24.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< LN3: case OrN3. Subgoal 1.24.1.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.24.1.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.24.1.1: Variables: N FE EE V EE' O N2 N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E1 V (Scope::EE') O3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< search. Subgoal 1.24.1.2: Variables: N FE EE V EE' O N2 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.24.1.2: Variables: N FE EE V EE' O N2 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N2 ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E1 V (Scope::EE') O3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< search. Subgoal 1.24.2: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply IH7 to R2 Acc _ _ _. Subgoal 1.24.2: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< Ev: apply drop_ext_size_evalStmt to R2. Subgoal 1.24.2: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply evalStmt_isCtx to _ _ _ Ev. Subgoal 1.24.2: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< LN3: case OrN3. Subgoal 1.24.2.1: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< A3: apply Acc' to _ LN3. Subgoal 1.24.2.1: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply IH4 to R3 A3 _ _ _. Subgoal 1.24.2.1: Variables: N FE EE V EE' O N3 EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalExpr {P}> FE EE3 E1 V (Scope::EE') O3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< search. Subgoal 1.24.2.2: Variables: N FE EE V EE' O EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< apply IH4 to R3 Acc _ _ _. Subgoal 1.24.2.2: Variables: N FE EE V EE' O EE3 O2 Scope O3 E1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (stmtExpr S E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalStmt {ES}> FE ([]::EE) S EE3 O2 N ** R3 : <evalExpr {ES}> FE EE3 E1 V (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S Is1 : is_expr E1 Ev1 : evalStmt FE ([]::EE) S EE3 O2 H2 : <evalStmt {P}> FE ([]::EE) S EE3 O2 Ev : evalStmt FE ([]::EE) S EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalExpr {P}> FE EE3 E1 V (Scope::EE') O3 ============================ <evalExpr {P}> FE EE (stmtExpr S E1) V EE' O
< search. Subgoal 1.25: Variables: N FE EE EE' O VF RF IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (recBuild RF) (recVal VF) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (recBuild RF) R1 : <evalRecFields {ES}> FE EE RF VF EE' O N ** ============================ <evalExpr {P}> FE EE (recBuild RF) (recVal VF) EE' O
< case IsE. Subgoal 1.25: Variables: N FE EE EE' O VF RF IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (recBuild RF) (recVal VF) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalRecFields {ES}> FE EE RF VF EE' O N ** H1 : is_recFieldExprs RF ============================ <evalExpr {P}> FE EE (recBuild RF) (recVal VF) EE' O
< apply IH6 to R1 Acc _ _ _. Subgoal 1.25: Variables: N FE EE EE' O VF RF IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (recBuild RF) (recVal VF) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalRecFields {ES}> FE EE RF VF EE' O N ** H1 : is_recFieldExprs RF H2 : <evalRecFields {P}> FE EE RF VF EE' O ============================ <evalExpr {P}> FE EE (recBuild RF) (recVal VF) EE' O
< search. Subgoal 1.26: Variables: N FE EE V EE' O Fields F Rec IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (recFieldAccess Rec F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (recFieldAccess Rec F) R1 : <evalExpr {ES}> FE EE Rec (recVal Fields) EE' O N ** R2 : lookup Fields F V ============================ <evalExpr {P}> FE EE (recFieldAccess Rec F) V EE' O
< case IsE. Subgoal 1.26: Variables: N FE EE V EE' O Fields F Rec IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (recFieldAccess Rec F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE Rec (recVal Fields) EE' O N ** R2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ <evalExpr {P}> FE EE (recFieldAccess Rec F) V EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 1.26: Variables: N FE EE V EE' O Fields F Rec IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (recFieldAccess Rec F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE Rec (recVal Fields) EE' O N ** R2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : <evalExpr {P}> FE EE Rec (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (recFieldAccess Rec F) V EE' O
< search. Subgoal 2.1: Variables: FE EE' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE' nilArgs [] EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsA : is_args nilArgs ============================ <evalArgs {P}> FE EE' nilArgs [] EE' []
< search. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< Acc': case Acc (keep). Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< LE_N3: apply ext_size_pos_evalArgs to R3. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply ext_size_is_int_evalArgs to R3. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsA : is_args (consArgs E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< Is: case IsA. Subgoal 2.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< LN2: case OrN2. Subgoal 2.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< A2: apply Acc' to _ LN2. Subgoal 2.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply IH to R2 A2 _ _ _. Subgoal 2.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 2.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< LN3: case OrN3. Subgoal 2.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< A3: apply Acc' to _ LN3. Subgoal 2.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply IH5 to R3 A3 _ _ _. Subgoal 2.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalArgs {P}> FE EE3 Rest VRest EE' O3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< search. Subgoal 2.2.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply IH5 to R3 Acc _ _ _. Subgoal 2.2.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E Is1 : is_args Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalArgs {P}> FE EE3 Rest VRest EE' O3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< search. Subgoal 2.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 2.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 2.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< LN3: case OrN3. Subgoal 2.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< A3: apply Acc' to _ LN3. Subgoal 2.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply IH5 to R3 A3 _ _ _. Subgoal 2.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalArgs {P}> FE EE3 Rest VRest EE' O3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< search. Subgoal 2.2.2.2: Variables: N FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< apply IH5 to R3 Acc _ _ _. Subgoal 2.2.2.2: Variables: N FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalArgs {ES}> FE EE (consArgs E Rest) (V1::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalArgs {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr E Is1 : is_args Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalArgs {P}> FE EE3 Rest VRest EE' O3 ============================ <evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) EE' O
< search. Subgoal 3.1: Variables: FE EE' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE' nilRecFieldExprs [] EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsRF : is_recFieldExprs nilRecFieldExprs ============================ <evalRecFields {P}> FE EE' nilRecFieldExprs [] EE' []
< search. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< Acc': case Acc (keep). Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< LE_N3: apply ext_size_pos_evalRecFields to R3. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply ext_size_is_int_evalRecFields to R3. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< Is: case IsRF. Subgoal 3.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< LN2: case OrN2. Subgoal 3.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< A2: apply Acc' to _ LN2. Subgoal 3.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply IH to R2 A2 _ _ _. Subgoal 3.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 3.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 3.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< LN3: case OrN3. Subgoal 3.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< A3: apply Acc' to _ LN3. Subgoal 3.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply IH6 to R3 A3 _ _ _. Subgoal 3.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalRecFields {P}> FE EE3 Rest VRest EE' O3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< search. Subgoal 3.2.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply IH6 to R3 Acc _ _ _. Subgoal 3.2.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N2 ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalRecFields {P}> FE EE3 Rest VRest EE' O3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< search. Subgoal 3.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 3.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 3.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 3.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< LN3: case OrN3. Subgoal 3.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< A3: apply Acc' to _ LN3. Subgoal 3.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply IH6 to R3 A3 _ _ _. Subgoal 3.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalRecFields {P}> FE EE3 Rest VRest EE' O3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< search. Subgoal 3.2.2.2: Variables: N FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< apply IH6 to R3 Acc _ _ _. Subgoal 3.2.2.2: Variables: N FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalRecFields {ES}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE E V1 EE3 O2 N ** R3 : <evalRecFields {ES}> FE EE3 Rest VRest EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_string F Is1 : is_expr E Is2 : is_recFieldExprs Rest H2 : <evalExpr {P}> FE EE E V1 EE3 O2 Ev : evalExpr FE EE E V1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalRecFields {P}> FE EE3 Rest VRest EE' O3 ============================ <evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O
< search. Subgoal 4.1: Variables: FE EE' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE' noop EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsS : is_stmt noop ============================ <evalStmt {P}> FE EE' noop EE' []
< search. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< Acc': case Acc (keep). Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< LE_N2: apply ext_size_pos_evalStmt to R2. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< LE_N3: apply ext_size_pos_evalStmt to R3. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply ext_size_is_int_evalStmt to R3. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (seq S1 S2) R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< Is: case IsS. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< Ev1: apply drop_ext_size_evalStmt to R2. Subgoal 4.2: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< LN2: case OrN2. Subgoal 4.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< A2: apply Acc' to _ LN2. Subgoal 4.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply IH7 to R2 A2 _ _ _. Subgoal 4.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< Ev: apply drop_ext_size_evalStmt to R2. Subgoal 4.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply evalStmt_isCtx to _ _ _ Ev. Subgoal 4.2.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< LN3: case OrN3. Subgoal 4.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< A3: apply Acc' to _ LN3. Subgoal 4.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply IH7 to R3 A3 _ _ _. Subgoal 4.2.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalStmt {P}> FE EE3 S2 EE' O3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< search. Subgoal 4.2.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply IH7 to R3 Acc _ _ _. Subgoal 4.2.1.2: Variables: N FE EE EE' O N2 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N2 ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalStmt {P}> FE EE3 S2 EE' O3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< search. Subgoal 4.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply IH7 to R2 Acc _ _ _. Subgoal 4.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< Ev: apply drop_ext_size_evalStmt to R2. Subgoal 4.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply evalStmt_isCtx to _ _ _ Ev. Subgoal 4.2.2: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< LN3: case OrN3. Subgoal 4.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< A3: apply Acc' to _ LN3. Subgoal 4.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply IH7 to R3 A3 _ _ _. Subgoal 4.2.2.1: Variables: N FE EE EE' O N3 EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalStmt {P}> FE EE3 S2 EE' O3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< search. Subgoal 4.2.2.2: Variables: N FE EE EE' O EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< apply IH7 to R3 Acc _ _ _. Subgoal 4.2.2.2: Variables: N FE EE EE' O EE3 O2 O3 S2 S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (seq S1 S2) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalStmt {ES}> FE EE S1 EE3 O2 N ** R3 : <evalStmt {ES}> FE EE3 S2 EE' O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_stmt S1 Is1 : is_stmt S2 Ev1 : evalStmt FE EE S1 EE3 O2 H2 : <evalStmt {P}> FE EE S1 EE3 O2 Ev : evalStmt FE EE S1 EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalStmt {P}> FE EE3 S2 EE' O3 ============================ <evalStmt {P}> FE EE (seq S1 S2) EE' O
< search. Subgoal 4.3: Variables: N FE EE O EE2 Scope V X E Ty IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (declare Ty X E) R1 : <evalExpr {ES}> FE EE E V (Scope::EE2) O N ** ============================ <evalStmt {P}> FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O
< case IsS. Subgoal 4.3: Variables: N FE EE O EE2 Scope V X E Ty IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E V (Scope::EE2) O N ** H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ <evalStmt {P}> FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.3: Variables: N FE EE O EE2 Scope V X E Ty IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E V (Scope::EE2) O N ** H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : <evalExpr {P}> FE EE E V (Scope::EE2) O ============================ <evalStmt {P}> FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O
< search. Subgoal 4.4: Variables: N FE EE EE' O V EE3 E X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assign X E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (assign X E) R1 : <evalExpr {ES}> FE EE E V EE3 O N ** R2 : replaceScopes X V EE3 EE' ============================ <evalStmt {P}> FE EE (assign X E) EE' O
< case IsS. Subgoal 4.4: Variables: N FE EE EE' O V EE3 E X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assign X E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E V EE3 O N ** R2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ <evalStmt {P}> FE EE (assign X E) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.4: Variables: N FE EE EE' O V EE3 E X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assign X E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E V EE3 O N ** R2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E H3 : <evalExpr {P}> FE EE E V EE3 O ============================ <evalStmt {P}> FE EE (assign X E) EE' O
< search. Subgoal 4.5: Variables: N FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (recUpdate Rec Fields E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (recUpdate Rec Fields E) R1 : <evalExpr {ES}> FE EE E V EE3 O N ** R2 : lookupScopes Rec EE (recVal FieldVals) R3 : updateRecFields Fields V FieldVals NewVals R4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ <evalStmt {P}> FE EE (recUpdate Rec Fields E) EE' O
< case IsS. Subgoal 4.5: Variables: N FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (recUpdate Rec Fields E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E V EE3 O N ** R2 : lookupScopes Rec EE (recVal FieldVals) R3 : updateRecFields Fields V FieldVals NewVals R4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ <evalStmt {P}> FE EE (recUpdate Rec Fields E) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.5: Variables: N FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (recUpdate Rec Fields E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E V EE3 O N ** R2 : lookupScopes Rec EE (recVal FieldVals) R3 : updateRecFields Fields V FieldVals NewVals R4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E H4 : <evalExpr {P}> FE EE E V EE3 O ============================ <evalStmt {P}> FE EE (recUpdate Rec Fields E) EE' O
< search. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Acc': case Acc (keep). Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LE_N3: apply ext_size_pos_evalStmt to R3. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply ext_size_is_int_evalStmt to R3. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Is: case IsS. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 4.6: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LN2: case OrN2. Subgoal 4.6.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< A2: apply Acc' to _ LN2. Subgoal 4.6.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 4.6.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 4.6.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.6.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LN3: case OrN3. Subgoal 4.6.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< A3: apply Acc' to _ LN3. Subgoal 4.6.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 A3 _ _ _. Subgoal 4.6.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalStmt {P}> FE ([]::EE3) Th (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.6.1.2: Variables: N FE EE EE' O N2 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 Acc _ _ _. Subgoal 4.6.1.2: Variables: N FE EE EE' O N2 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalStmt {P}> FE ([]::EE3) Th (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.6.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 4.6.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 4.6.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.6.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LN3: case OrN3. Subgoal 4.6.2.1: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< A3: apply Acc' to _ LN3. Subgoal 4.6.2.1: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 A3 _ _ _. Subgoal 4.6.2.1: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalStmt {P}> FE ([]::EE3) Th (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.6.2.2: Variables: N FE EE EE' O EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 Acc _ _ _. Subgoal 4.6.2.2: Variables: N FE EE EE' O EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE Cond trueVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) Th (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond trueVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond trueVal EE3 O2 Ev : evalExpr FE EE Cond trueVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalStmt {P}> FE ([]::EE3) Th (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Acc': case Acc (keep). Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R2. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LE_N3: apply ext_size_pos_evalStmt to R3. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< OrN2: apply lt_left to R1 _ _. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply ext_size_is_int_evalStmt to R3. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< OrN3: apply lt_right to R1 _ _ _. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (ifThenElse Cond Th El) R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Is: case IsS. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Ev1: apply drop_ext_size_evalExpr to R2. Subgoal 4.7: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 OrN2 : N2 < N \/ N2 = N H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LN2: case OrN2. Subgoal 4.7.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< A2: apply Acc' to _ LN2. Subgoal 4.7.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH4 to R2 A2 _ _ _. Subgoal 4.7.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 4.7.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.7.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LN3: case OrN3. Subgoal 4.7.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< A3: apply Acc' to _ LN3. Subgoal 4.7.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 A3 _ _ _. Subgoal 4.7.1.1: Variables: N FE EE EE' O N2 N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalStmt {P}> FE ([]::EE3) El (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.7.1.2: Variables: N FE EE EE' O N2 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 Acc _ _ _. Subgoal 4.7.1.2: Variables: N FE EE EE' O N2 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N2 + N = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N2 ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N2 LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 LN2 : N2 < N A2 : acc N2 * H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalStmt {P}> FE ([]::EE3) El (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.7.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH4 to R2 Acc _ _ _. Subgoal 4.7.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 4.7.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.7.2: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 OrN3 : N3 < N \/ N3 = N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< LN3: case OrN3. Subgoal 4.7.2.1: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< A3: apply Acc' to _ LN3. Subgoal 4.7.2.1: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 A3 _ _ _. Subgoal 4.7.2.1: Variables: N FE EE EE' O N3 EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N3 = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N3 ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N3 H1 : is_integer N3 Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 LN3 : N3 < N A3 : acc N3 * H4 : <evalStmt {P}> FE ([]::EE3) El (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.7.2.2: Variables: N FE EE EE' O EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< apply IH7 to R3 Acc _ _ _. Subgoal 4.7.2.2: Variables: N FE EE EE' O EE3 O2 Scope O3 El Th Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (ifThenElse Cond Th El) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N = N R2 : <evalExpr {ES}> FE EE Cond falseVal EE3 O2 N ** R3 : <evalStmt {ES}> FE ([]::EE3) El (Scope::EE') O3 N ** R4 : O2 ++ O3 = O Acc' : forall M, 0 <= M -> M < N -> acc M * LE_N2 : 0 <= N LE_N3 : 0 <= N H1 : is_integer N Is : is_expr Cond Is1 : is_stmt Th Is2 : is_stmt El Ev1 : evalExpr FE EE Cond falseVal EE3 O2 H2 : <evalExpr {P}> FE EE Cond falseVal EE3 O2 Ev : evalExpr FE EE Cond falseVal EE3 O2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : <evalStmt {P}> FE ([]::EE3) El (Scope::EE') O3 ============================ <evalStmt {P}> FE EE (ifThenElse Cond Th El) EE' O
< search. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (while Cond Body) R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N2: apply ext_size_pos_evalExpr to R3. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (while Cond Body) R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N4: apply ext_size_pos_evalStmt to R5. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (while Cond Body) R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N5: apply ext_size_pos_evalStmt to R4. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (while Cond Body) R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< Is: case IsS. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< EvCond: apply drop_ext_size_evalExpr to R3. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply evalExpr_isCtx to _ _ _ EvCond. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< EvBody: apply drop_ext_size_evalStmt to R4. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< IsEE4+: apply evalStmt_isCtx to _ _ _ EvBody. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< case IsEE4+. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply ext_size_is_int_evalStmt to R5. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply ext_size_is_int_evalStmt to R4. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N2_N5: apply lte_left to R2 _ _ _. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N4_N5: apply lte_right to R2 _ _ _. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply lesseq_integer__add_positives to _ _ R2. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< Or3: apply lt_left to R1 _ _. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply plus_integer_is_integer to _ _ R2. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N5_N: apply lte_right to R1 _ _ _. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N2_N: apply lesseq_integer_transitive to LE_N2_N5 LE_N5_N. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< LE_N4_N: apply lesseq_integer_transitive to LE_N4_N5 LE_N5_N. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< Or2: apply lesseq_integer_less_or_eq to LE_N2_N. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< Or4: apply lesseq_integer_less_or_eq to LE_N4_N. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< Acc': case Acc (keep). Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< assert <evalExpr {P}> FE EE Cond trueVal EE2 O2. Subgoal 4.8.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE Cond trueVal EE2 O2
< LN3: case Or3. Subgoal 4.8.1.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * LN3 : N3 < N ============================ <evalExpr {P}> FE EE Cond trueVal EE2 O2
< A3: apply Acc' to _ LN3. Subgoal 4.8.1.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * LN3 : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE Cond trueVal EE2 O2
< apply IH4 to R3 A3 _ _ _. Subgoal 4.8.1.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * LN3 : N3 < N A3 : acc N3 * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 ============================ <evalExpr {P}> FE EE Cond trueVal EE2 O2
< search. Subgoal 4.8.1.2: Variables: N FE EE EE' O N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE Cond trueVal EE2 O2
< apply IH4 to R3 Acc _ _ _. Subgoal 4.8.1.2: Variables: N FE EE EE' O N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 ============================ <evalExpr {P}> FE EE Cond trueVal EE2 O2
< search. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< assert <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3. Subgoal 4.8.2: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 ============================ <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3
< LN2: case Or2. Subgoal 4.8.2.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 LN2 : N2 < N ============================ <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3
< A2: apply Acc' to _ LN2. Subgoal 4.8.2.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 LN2 : N2 < N A2 : acc N2 * ============================ <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3
< apply IH7 to R4 A2 _ _ _. Subgoal 4.8.2.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 LN2 : N2 < N A2 : acc N2 * H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 ============================ <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3
< search. Subgoal 4.8.2.2: Variables: N FE EE EE' O N3 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N LE_N2_N5 : N <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N <= N LE_N4_N : N4 <= N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 ============================ <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3
< apply IH7 to R4 Acc _ _ _. Subgoal 4.8.2.2: Variables: N FE EE EE' O N3 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N LE_N2_N5 : N <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N <= N LE_N4_N : N4 <= N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 ============================ <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3
< search. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< assert <evalStmt {P}> FE EE4 (while Cond Body) EE' O4. Subgoal 4.8.3: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 ============================ <evalStmt {P}> FE EE4 (while Cond Body) EE' O4
< LN4: case Or4. Subgoal 4.8.3.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 LN4 : N4 < N ============================ <evalStmt {P}> FE EE4 (while Cond Body) EE' O4
< A4: apply Acc' to _ LN4. Subgoal 4.8.3.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 LN4 : N4 < N A4 : acc N4 * ============================ <evalStmt {P}> FE EE4 (while Cond Body) EE' O4
< apply IH7 to R5 A4 _ _ _. Subgoal 4.8.3.1: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 LN4 : N4 < N A4 : acc N4 * H11 : <evalStmt {P}> FE EE4 (while Cond Body) EE' O4 ============================ <evalStmt {P}> FE EE4 (while Cond Body) EE' O4
< search. Subgoal 4.8.3.2: Variables: N FE EE EE' O N3 N2 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N <= N Or2 : N2 < N \/ N2 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 ============================ <evalStmt {P}> FE EE4 (while Cond Body) EE' O4
< apply IH7 to R5 Acc _ _ _. Subgoal 4.8.3.2: Variables: N FE EE EE' O N3 N2 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N <= N Or2 : N2 < N \/ N2 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 H11 : <evalStmt {P}> FE EE4 (while Cond Body) EE' O4 ============================ <evalStmt {P}> FE EE4 (while Cond Body) EE' O4
< search. Subgoal 4.8: Variables: N FE EE EE' O N3 N2 N4 N5 EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : N3 + N5 = N R2 : N2 + N4 = N5 R3 : <evalExpr {ES}> FE EE Cond trueVal EE2 O2 N3 ** R4 : <evalStmt {ES}> FE ([]::EE2) Body (Scope::EE4) O3 N2 ** R5 : <evalStmt {ES}> FE EE4 (while Cond Body) EE' O4 N4 ** R6 : O2 ++ O3 = O12 R7 : O12 ++ O4 = O LE_N2 : 0 <= N3 LE_N4 : 0 <= N4 LE_N5 : 0 <= N2 Is : is_expr Cond Is1 : is_stmt Body EvCond : evalExpr FE EE Cond trueVal EE2 O2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 EvBody : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 H2 : is_list (is_pair is_string is_value) Scope H3 : is_list (is_list (is_pair is_string is_value)) EE4 H4 : is_integer N3 H5 : is_integer N4 H6 : is_integer N2 LE_N2_N5 : N2 <= N5 LE_N4_N5 : N4 <= N5 H7 : 0 <= N5 Or3 : N3 < N \/ N3 = N H8 : is_integer N5 LE_N5_N : N5 <= N LE_N2_N : N2 <= N LE_N4_N : N4 <= N Or2 : N2 < N \/ N2 = N Or4 : N4 < N \/ N4 = N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : <evalExpr {P}> FE EE Cond trueVal EE2 O2 H10 : <evalStmt {P}> FE ([]::EE2) Body (Scope::EE4) O3 H11 : <evalStmt {P}> FE EE4 (while Cond Body) EE' O4 ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< search. Subgoal 4.9: Variables: N FE EE EE' O Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (while Cond Body) R1 : <evalExpr {ES}> FE EE Cond falseVal EE' O N ** ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< case IsS. Subgoal 4.9: Variables: N FE EE EE' O Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE Cond falseVal EE' O N ** H1 : is_expr Cond H2 : is_stmt Body ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.9: Variables: N FE EE EE' O Body Cond IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (while Cond Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE Cond falseVal EE' O N ** H1 : is_expr Cond H2 : is_stmt Body H3 : <evalExpr {P}> FE EE Cond falseVal EE' O ============================ <evalStmt {P}> FE EE (while Cond Body) EE' O
< search. Subgoal 4.10: Variables: N FE EE EE' O Scope S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (scopeStmt S1) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (scopeStmt S1) R1 : <evalStmt {ES}> FE ([]::EE) S1 (Scope::EE') O N ** ============================ <evalStmt {P}> FE EE (scopeStmt S1) EE' O
< case IsS. Subgoal 4.10: Variables: N FE EE EE' O Scope S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (scopeStmt S1) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalStmt {ES}> FE ([]::EE) S1 (Scope::EE') O N ** H1 : is_stmt S1 ============================ <evalStmt {P}> FE EE (scopeStmt S1) EE' O
< apply IH7 to R1 Acc _ _ _. Subgoal 4.10: Variables: N FE EE EE' O Scope S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (scopeStmt S1) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalStmt {ES}> FE ([]::EE) S1 (Scope::EE') O N ** H1 : is_stmt S1 H2 : <evalStmt {P}> FE ([]::EE) S1 (Scope::EE') O ============================ <evalStmt {P}> FE EE (scopeStmt S1) EE' O
< search. Subgoal 4.11: Variables: N FE EE EE' O I O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (printVal E) R1 : <evalExpr {ES}> FE EE E (intVal I) EE' O2 N ** R2 : O2 ++ [intVal I] = O ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< case IsS. Subgoal 4.11: Variables: N FE EE EE' O I O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E (intVal I) EE' O2 N ** R2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.11: Variables: N FE EE EE' O I O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E (intVal I) EE' O2 N ** R2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : <evalExpr {P}> FE EE E (intVal I) EE' O2 ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< search. Subgoal 4.12: Variables: N FE EE EE' O O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (printVal E) R1 : <evalExpr {ES}> FE EE E trueVal EE' O2 N ** R2 : O2 ++ [trueVal] = O ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< case IsS. Subgoal 4.12: Variables: N FE EE EE' O O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E trueVal EE' O2 N ** R2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.12: Variables: N FE EE EE' O O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E trueVal EE' O2 N ** R2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : <evalExpr {P}> FE EE E trueVal EE' O2 ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< search. Subgoal 4.13: Variables: N FE EE EE' O O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (printVal E) R1 : <evalExpr {ES}> FE EE E falseVal EE' O2 N ** R2 : O2 ++ [falseVal] = O ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< case IsS. Subgoal 4.13: Variables: N FE EE EE' O O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E falseVal EE' O2 N ** R2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.13: Variables: N FE EE EE' O O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E falseVal EE' O2 N ** R2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : <evalExpr {P}> FE EE E falseVal EE' O2 ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< search. Subgoal 4.14: Variables: N FE EE EE' O S1 O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (printVal E) R1 : <evalExpr {ES}> FE EE E (stringVal S1) EE' O2 N ** R2 : O2 ++ [stringVal S1] = O ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< case IsS. Subgoal 4.14: Variables: N FE EE EE' O S1 O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E (stringVal S1) EE' O2 N ** R2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< apply IH4 to R1 Acc _ _ _. Subgoal 4.14: Variables: N FE EE EE' O S1 O2 E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (printVal E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : <evalExpr {ES}> FE EE E (stringVal S1) EE' O2 N ** R2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : <evalExpr {P}> FE EE E (stringVal S1) EE' O2 ============================ <evalStmt {P}> FE EE (printVal E) EE' O
< search. Proof completed.
< Extensible_Theorem paramName_unique : forall P NA NB, IsP : is_param P -> PA : paramName P NA -> PB : paramName P NB -> NA = NB on PA. Variables: NA NB Ty IH : forall P NA NB, is_param P -> paramName P NA * -> paramName P NB -> NA = NB IsP : is_param (param NA Ty) PA : paramName (param NA Ty) NA @ PB : paramName (param NA Ty) NB ============================ NA = NB
< case PB. Variables: NB Ty IH : forall P NA NB, is_param P -> paramName P NA * -> paramName P NB -> NA = NB IsP : is_param (param NB Ty) PA : paramName (param NB Ty) NB @ ============================ NB = NB
< search. Proof completed.
< Theorem paramNames_unique : forall P NA NB, is_list is_param P -> paramNames P NA -> paramNames P NB -> NA = NB. ============================ forall P NA NB, is_list is_param P -> paramNames P NA -> paramNames P NB -> NA = NB
< induction on 2. IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB ============================ forall P NA NB, is_list is_param P -> paramNames P NA @ -> paramNames P NB -> NA = NB
< intros IsP PA PB. Variables: P NA NB IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB IsP : is_list is_param P PA : paramNames P NA @ PB : paramNames P NB ============================ NA = NB
< PA: case PA. Subgoal 1: Variables: NB IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB IsP : is_list is_param [] PB : paramNames [] NB ============================ [] = NB
< case PB. Subgoal 1: IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB IsP : is_list is_param [] ============================ [] = []
< search. Subgoal 2: Variables: NB NRest N PRest P1 IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB IsP : is_list is_param (P1::PRest) PB : paramNames (P1::PRest) NB PA : paramName P1 N PA1 : paramNames PRest NRest * ============================ N::NRest = NB
< PB: case PB. Subgoal 2: Variables: NRest N PRest P1 NRest1 N1 IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB IsP : is_list is_param (P1::PRest) PA : paramName P1 N PA1 : paramNames PRest NRest * PB : paramName P1 N1 PB1 : paramNames PRest NRest1 ============================ N::NRest = N1::NRest1
< case IsP. Subgoal 2: Variables: NRest N PRest P1 NRest1 N1 IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB PA : paramName P1 N PA1 : paramNames PRest NRest * PB : paramName P1 N1 PB1 : paramNames PRest NRest1 H1 : is_param P1 H2 : is_list is_param PRest ============================ N::NRest = N1::NRest1
< apply paramName_unique to _ PA PB. Subgoal 2: Variables: NRest PRest P1 NRest1 N1 IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB PA : paramName P1 N1 PA1 : paramNames PRest NRest * PB : paramName P1 N1 PB1 : paramNames PRest NRest1 H1 : is_param P1 H2 : is_list is_param PRest ============================ N1::NRest = N1::NRest1
< apply IH to _ PA1 PB1. Subgoal 2: Variables: PRest P1 NRest1 N1 IH : forall P NA NB, is_list is_param P -> paramNames P NA * -> paramNames P NB -> NA = NB PA : paramName P1 N1 PA1 : paramNames PRest NRest1 * PB : paramName P1 N1 PB1 : paramNames PRest NRest1 H1 : is_param P1 H2 : is_list is_param PRest ============================ N1::NRest1 = N1::NRest1
< search. Proof completed.
< Projection_Constraint proj_paramName_forward : forall P P' N, Pr : |{param}- P ~~> P' -> IsP : is_param P -> PN : paramName P N -> paramName P' N. Proof completed.
< Projection_Constraint proj_paramName_back : forall P P' N, Pr : |{param}- P ~~> P' -> IsP : is_param P -> PN : paramName P' N -> paramName P N. Proof completed.
< Extensible_Theorem getFunEvalInfo_unique : forall F NA RA VA PA BA NB RB VB PB BB, IsF : is_fun F -> GFEIA : getFunEvalInfo F NA RA VA PA BA -> GFEIB : getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB on GFEIA. Variables: NA RA VA PA BA NB RB VB PB BB Params RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB IsF : is_fun (fun NA RetTy RA VA Params BA) GFEIA : getFunEvalInfo (fun NA RetTy RA VA Params BA) NA RA VA PA BA @ GFEIB : getFunEvalInfo (fun NA RetTy RA VA Params BA) NB RB VB PB BB GFEIA1 : paramNames Params PA ============================ (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB
< GFEIB: case GFEIB. Variables: PA NB RB VB PB BB Params RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB IsF : is_fun (fun NB RetTy RB VB Params BB) GFEIA : getFunEvalInfo (fun NB RetTy RB VB Params BB) NB RB VB PA BB @ GFEIA1 : paramNames Params PA GFEIB : paramNames Params PB ============================ (((NB = NB /\ RB = RB) /\ VB = VB) /\ PA = PB) /\ BB = BB
< case IsF. Variables: PA NB RB VB PB BB Params RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB GFEIA : getFunEvalInfo (fun NB RetTy RB VB Params BB) NB RB VB PA BB @ GFEIA1 : paramNames Params PA GFEIB : paramNames Params PB H1 : is_string NB H2 : is_typ RetTy H3 : is_string RB H4 : is_value VB H5 : is_list is_param Params H6 : is_stmt BB ============================ (((NB = NB /\ RB = RB) /\ VB = VB) /\ PA = PB) /\ BB = BB
< apply paramNames_unique to _ GFEIA1 GFEIB. Variables: NB RB VB PB BB Params RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB GFEIA : getFunEvalInfo (fun NB RetTy RB VB Params BB) NB RB VB PB BB @ GFEIA1 : paramNames Params PB GFEIB : paramNames Params PB H1 : is_string NB H2 : is_typ RetTy H3 : is_string RB H4 : is_value VB H5 : is_list is_param Params H6 : is_stmt BB ============================ (((NB = NB /\ RB = RB) /\ VB = VB) /\ PB = PB) /\ BB = BB
< search. Proof completed.
< Theorem getFunEvalCtx_unique : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA -> getFunEvalCtx Fs FCB -> FCA = FCB. ============================ forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA -> getFunEvalCtx Fs FCB -> FCA = FCB
< induction on 2. IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB ============================ forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA @ -> getFunEvalCtx Fs FCB -> FCA = FCB
< intros IsFs GFECA GFECB. Variables: Fs FCA FCB IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB IsFs : is_list is_fun Fs GFECA : getFunEvalCtx Fs FCA @ GFECB : getFunEvalCtx Fs FCB ============================ FCA = FCB
< GFECA: case GFECA. Subgoal 1: Variables: FCB IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB IsFs : is_list is_fun [] GFECB : getFunEvalCtx [] FCB ============================ [] = FCB
< case GFECB. Subgoal 1: IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB IsFs : is_list is_fun [] ============================ [] = []
< search. Subgoal 2: Variables: FCB CRest Body PNames RVVal RetVar FName FRest F IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB IsFs : is_list is_fun (F::FRest) GFECB : getFunEvalCtx (F::FRest) FCB GFECA : getFunEvalInfo F FName RetVar RVVal PNames Body GFECA1 : getFunEvalCtx FRest CRest * ============================ (FName, (RetVar, (RVVal, (PNames, Body))))::CRest = FCB
< GFECB: case GFECB. Subgoal 2: Variables: CRest Body PNames RVVal RetVar FName FRest F CRest1 Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB IsFs : is_list is_fun (F::FRest) GFECA : getFunEvalInfo F FName RetVar RVVal PNames Body GFECA1 : getFunEvalCtx FRest CRest * GFECB : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFECB1 : getFunEvalCtx FRest CRest1 ============================ (FName, (RetVar, (RVVal, (PNames, Body))))::CRest = (FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest1
< case IsFs. Subgoal 2: Variables: CRest Body PNames RVVal RetVar FName FRest F CRest1 Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB GFECA : getFunEvalInfo F FName RetVar RVVal PNames Body GFECA1 : getFunEvalCtx FRest CRest * GFECB : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFECB1 : getFunEvalCtx FRest CRest1 H1 : is_fun F H2 : is_list is_fun FRest ============================ (FName, (RetVar, (RVVal, (PNames, Body))))::CRest = (FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest1
< apply getFunEvalInfo_unique to _ GFECA GFECB. Subgoal 2: Variables: CRest FRest F CRest1 Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB GFECA : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFECA1 : getFunEvalCtx FRest CRest * GFECB : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFECB1 : getFunEvalCtx FRest CRest1 H1 : is_fun F H2 : is_list is_fun FRest ============================ (FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest = (FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest1
< apply IH to _ GFECA1 GFECB1. Subgoal 2: Variables: FRest F CRest1 Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs FCA FCB, is_list is_fun Fs -> getFunEvalCtx Fs FCA * -> getFunEvalCtx Fs FCB -> FCA = FCB GFECA : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFECA1 : getFunEvalCtx FRest CRest1 * GFECB : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFECB1 : getFunEvalCtx FRest CRest1 H1 : is_fun F H2 : is_list is_fun FRest ============================ (FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest1 = (FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest1
< search. Proof completed.
< Projection_Constraint proj_getFunEvalInfo_forward : forall F F' N R V P B, Pr : |{fun}- F ~~> F' -> IsF : is_fun F -> GFEI : getFunEvalInfo F N R V P B -> getFunEvalInfo F' N R V P B. Proof completed.
< Projection_Constraint proj_getFunEvalInfo_back : forall F F' N R V P B, Pr : |{fun}- F ~~> F' -> IsF : is_fun F -> GFEI : getFunEvalInfo F' N R V P B -> getFunEvalInfo F N R V P B. Proof completed.
< Extensible_Theorem evalProgram_unique : forall A P OA OB, IsA : is_list is_value A -> IsP : is_program P -> EvA : evalProgram A P OA -> EvB : evalProgram A P OB -> OA = OB on EvA. Variables: A OA OB FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A IsP : is_program (program Funs Main) EvA : evalProgram A (program Funs Main) OA @ EvB : evalProgram A (program Funs Main) OB EvA1 : getFunEvalCtx Funs FCtx EvA2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA3 : zip PNames A InitEnv EvA4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE OA ============================ OA = OB
< EvB: case EvB. Variables: A OA OB FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A IsP : is_program (program Funs Main) EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx EvA2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA3 : zip PNames A InitEnv EvA4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB ============================ OA = OB
< case IsP. Variables: A OA OB FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx EvA2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA3 : zip PNames A InitEnv EvA4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main ============================ OA = OB
< apply getFunEvalCtx_unique to _ EvA1 EvB. Variables: A OA OB MainName RetVar RetVal PNames Body InitEnv EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA3 : zip PNames A InitEnv EvA4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx1) [(RetVar, RetVal)::InitEnv] Body EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main ============================ OA = OB
< apply getFunEvalInfo_unique to _ EvA2 EvB1. Variables: A OA OB InitEnv EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvA3 : zip PNames1 A InitEnv EvA4 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv] Body1 EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main ============================ OA = OB
< apply zip_unique to EvA3 EvB2. Variables: A OA OB EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvA3 : zip PNames1 A InitEnv1 EvA4 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main ============================ OA = OB
< apply getFunEvalCtx_is to _ EvA1. Variables: A OA OB EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvA3 : zip PNames1 A InitEnv1 EvA4 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx1 ============================ OA = OB
< apply getFunEvalInfo_is to _ EvA2. Variables: A OA OB EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvA3 : zip PNames1 A InitEnv1 EvA4 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx1 H4 : is_string MainName1 H5 : is_string RetVar1 H6 : is_value RetVal1 H7 : is_list is_string PNames1 H8 : is_stmt Body1 ============================ OA = OB
< apply zip_is to _ _ EvA3. Variables: A OA OB EE Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OA @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvA3 : zip PNames1 A InitEnv1 EvA4 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE OA EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx1 H4 : is_string MainName1 H5 : is_string RetVar1 H6 : is_value RetVal1 H7 : is_list is_string PNames1 H8 : is_stmt Body1 H9 : is_list (is_pair is_string is_value) InitEnv1 ============================ OA = OB
< apply evalStmt_unique to _ _ _ EvA4 EvB3. Variables: A OB Main Funs FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall A P OA OB, is_list is_value A -> is_program P -> evalProgram A P OA * -> evalProgram A P OB -> OA = OB IsA : is_list is_value A EvA : evalProgram A (program Funs Main) OB @ EvA1 : getFunEvalCtx Funs FCtx1 EvA2 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvA3 : zip PNames1 A InitEnv1 EvA4 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 OB H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx1 H4 : is_string MainName1 H5 : is_string RetVar1 H6 : is_value RetVal1 H7 : is_list is_string PNames1 H8 : is_stmt Body1 H9 : is_list (is_pair is_string is_value) InitEnv1 ============================ OB = OB
< search. Proof completed.
< Projection_Constraint proj_evalProgram_forward : forall P P' A O, Pr : |{program}- P ~~> P' -> IsP : is_program P -> IsA : is_list is_value A -> Ev : evalProgram A P O -> evalProgram A P' O. Proof completed.
< Projection_Constraint proj_evalProgram_back : forall P P' A O, Pr : |{program}- P ~~> P' -> IsP : is_program P -> IsA : is_list is_value A -> Ev : evalProgram A P' O -> evalProgram A P O. Proof completed.
< Define related_all_scopes : (list (list (pair (string) typ))) -> (list (list (pair (string) value))) -> prop by related_all_scopes [] []; related_all_scopes (A::ARest) (B::BRest) := ((forall X T, lookup A X T -> exists V, lookup B X V /\ valueType V T) /\ (forall X, no_lookup A X -> no_lookup B X)) /\ related_all_scopes ARest BRest.
< Theorem related_all_scopes_add : forall A B AS BS X V T, related_all_scopes (AS::A) (BS::B) -> valueType V T -> related_all_scopes (((X, T)::AS)::A) (((X, V)::BS)::B). ============================ forall A B AS BS X V T, related_all_scopes (AS::A) (BS::B) -> valueType V T -> related_all_scopes (((X, T)::AS)::A) (((X, V)::BS)::B)
< intros RAS. Variables: A B AS BS X V T RAS : related_all_scopes (AS::A) (BS::B) H1 : valueType V T ============================ related_all_scopes (((X, T)::AS)::A) (((X, V)::BS)::B)
< R: case RAS. Variables: A B AS BS X V T H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B ============================ related_all_scopes (((X, T)::AS)::A) (((X, V)::BS)::B)
< unfold . Subgoal 1: Variables: A B AS BS X V T H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B ============================ forall X1 T1, lookup ((X, T)::AS) X1 T1 -> exists V1, lookup ((X, V)::BS) X1 V1 /\ valueType V1 T1
< intros LkpA LkpB. Subgoal 1: Variables: A B AS BS X V T X1 T1 H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B LkpA : lookup ((X, T)::AS) X1 T1 ============================ exists V1, lookup ((X, V)::BS) X1 V1 /\ valueType V1 T1
< LkpA: case LkpA. Subgoal 1.1: Variables: A B AS BS V X1 T1 H1 : valueType V T1 R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B ============================ exists V1, lookup ((X1, V)::BS) X1 V1 /\ valueType V1 T1
< search. Subgoal 1.2: Variables: A B AS BS X V T X1 T1 H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B LkpA : X = X1 -> false LkpA1 : lookup AS X1 T1 ============================ exists V1, lookup ((X, V)::BS) X1 V1 /\ valueType V1 T1
< apply R to LkpA1. Subgoal 1.2: Variables: A B AS BS X V T X1 T1 V1 H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B LkpA : X = X1 -> false LkpA1 : lookup AS X1 T1 H2 : lookup BS X1 V1 H3 : valueType V1 T1 ============================ exists V1, lookup ((X, V)::BS) X1 V1 /\ valueType V1 T1
< search. Subgoal 2: Variables: A B AS BS X V T H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B ============================ forall X1, no_lookup ((X, T)::AS) X1 -> no_lookup ((X, V)::BS) X1
< intros N. Subgoal 2: Variables: A B AS BS X V T X1 H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B N : no_lookup ((X, T)::AS) X1 ============================ no_lookup ((X, V)::BS) X1
< N: case N. Subgoal 2: Variables: A B AS BS X V T X1 H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B N : X = X1 -> false N1 : no_lookup AS X1 ============================ no_lookup ((X, V)::BS) X1
< apply R1 to N1. Subgoal 2: Variables: A B AS BS X V T X1 H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B N : X = X1 -> false N1 : no_lookup AS X1 H2 : no_lookup BS X1 ============================ no_lookup ((X, V)::BS) X1
< search. Subgoal 3: Variables: A B AS BS X V T H1 : valueType V T R : forall X T, lookup AS X T -> exists V, lookup BS X V /\ valueType V T R1 : forall X, no_lookup AS X -> no_lookup BS X R2 : related_all_scopes A B ============================ related_all_scopes A B
< search. Proof completed.
< Theorem related_all_scopes_add_scope : forall A B, related_all_scopes A B -> related_all_scopes ([]::A) ([]::B). ============================ forall A B, related_all_scopes A B -> related_all_scopes ([]::A) ([]::B)
< intros R. Variables: A B R : related_all_scopes A B ============================ related_all_scopes ([]::A) ([]::B)
< unfold . Subgoal 1: Variables: A B R : related_all_scopes A B ============================ forall X T, lookup [] X T -> exists V, lookup [] X V /\ valueType V T
< intros L. Subgoal 1: Variables: A B X T R : related_all_scopes A B L : lookup [] X T ============================ exists V, lookup [] X V /\ valueType V T
< case L. Subgoal 2: Variables: A B R : related_all_scopes A B ============================ forall X, no_lookup [] X -> no_lookup [] X
< intros N. Subgoal 2: Variables: A B X R : related_all_scopes A B N : no_lookup [] X ============================ no_lookup [] X
< search. Subgoal 3: Variables: A B R : related_all_scopes A B ============================ related_all_scopes A B
< search. Proof completed.
< Theorem related_all_scopes_lookupScopes : forall A B X V T, related_all_scopes A B -> lookupScopes X A T -> lookupScopes X B V -> valueType V T. ============================ forall A B X V T, related_all_scopes A B -> lookupScopes X A T -> lookupScopes X B V -> valueType V T
< induction on 1. IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T ============================ forall A B X V T, related_all_scopes A B @ -> lookupScopes X A T -> lookupScopes X B V -> valueType V T
< intros R LA LB. Variables: A B X V T IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T R : related_all_scopes A B @ LA : lookupScopes X A T LB : lookupScopes X B V ============================ valueType V T
< LA: case LA. Subgoal 1: Variables: B X V T Rest L IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T R : related_all_scopes (L::Rest) B @ LB : lookupScopes X B V LA : lookup L X T ============================ valueType V T
< R: case R. Subgoal 1: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LB : lookupScopes X (B1::BRest) V LA : lookup L X T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * ============================ valueType V T
< LB: case LB. Subgoal 1.1: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : lookup L X T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : lookup B1 X V ============================ valueType V T
< L: apply R to LA. Subgoal 1.1: Variables: X V T Rest L BRest B1 V1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : lookup L X T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : lookup B1 X V L : lookup B1 X V1 L1 : valueType V1 T ============================ valueType V T
< apply lookup_unique to LB L. Subgoal 1.1: Variables: X T Rest L BRest B1 V1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : lookup L X T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : lookup B1 X V1 L : lookup B1 X V1 L1 : valueType V1 T ============================ valueType V1 T
< search. Subgoal 1.2: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : lookup L X T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : no_lookup B1 X LB1 : lookupScopes X BRest V ============================ valueType V T
< L: apply R to LA. Subgoal 1.2: Variables: X V T Rest L BRest B1 V1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : lookup L X T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : no_lookup B1 X LB1 : lookupScopes X BRest V L : lookup B1 X V1 L1 : valueType V1 T ============================ valueType V T
< apply no_lookup to LB L. Subgoal 2: Variables: B X V T Rest L IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T R : related_all_scopes (L::Rest) B @ LB : lookupScopes X B V LA : no_lookup L X LA1 : lookupScopes X Rest T ============================ valueType V T
< R: case R. Subgoal 2: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LB : lookupScopes X (B1::BRest) V LA : no_lookup L X LA1 : lookupScopes X Rest T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * ============================ valueType V T
< LB: case LB. Subgoal 2.1: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : no_lookup L X LA1 : lookupScopes X Rest T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : lookup B1 X V ============================ valueType V T
< N: apply R1 to LA. Subgoal 2.1: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : no_lookup L X LA1 : lookupScopes X Rest T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : lookup B1 X V N : no_lookup B1 X ============================ valueType V T
< apply no_lookup to N LB. Subgoal 2.2: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : no_lookup L X LA1 : lookupScopes X Rest T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : no_lookup B1 X LB1 : lookupScopes X BRest V ============================ valueType V T
< apply IH to R2 LA1 LB1. Subgoal 2.2: Variables: X V T Rest L BRest B1 IH : forall A B X V T, related_all_scopes A B * -> lookupScopes X A T -> lookupScopes X B V -> valueType V T LA : no_lookup L X LA1 : lookupScopes X Rest T R : forall X T, lookup L X T -> exists V, lookup B1 X V /\ valueType V T R1 : forall X, no_lookup L X -> no_lookup B1 X R2 : related_all_scopes Rest BRest * LB : no_lookup B1 X LB1 : lookupScopes X BRest V H1 : valueType V T ============================ valueType V T
< search. Proof completed.
< Define valueTypeList : (list value) -> (list typ) -> prop by valueTypeList [] []; valueTypeList (V::VRest) (T::TRest) := valueType V T /\ valueTypeList VRest TRest.
< Theorem valueTypeList_related_all_scopes : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope]. ============================ forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope]
< induction on 1. IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ============================ forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys @ -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope]
< intros VTL ZV ZT. Variables: Vs Tys Ns VScope TScope IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueTypeList Vs Tys @ ZV : zip Ns Vs VScope ZT : zip Ns Tys TScope ============================ related_all_scopes [TScope] [VScope]
< VTL: case VTL. Subgoal 1: Variables: Ns VScope TScope IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ZV : zip Ns [] VScope ZT : zip Ns [] TScope ============================ related_all_scopes [TScope] [VScope]
< case ZV. Subgoal 1: Variables: TScope IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ZT : zip [] [] TScope ============================ related_all_scopes [TScope] [[]]
< case ZT. Subgoal 1: IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ============================ related_all_scopes [[]] [[]]
< unfold . Subgoal 1.1: IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ============================ forall X T, lookup [] X T -> exists V, lookup [] X V /\ valueType V T
< intros L. Subgoal 1.1: Variables: X T IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] L : lookup [] X T ============================ exists V, lookup [] X V /\ valueType V T
< case L. Subgoal 1.2: IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ============================ forall X, no_lookup [] X -> no_lookup [] X
< intros. Subgoal 1.2: Variables: X IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] H1 : no_lookup [] X ============================ no_lookup [] X
< search. Subgoal 1.3: IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ============================ related_all_scopes [] []
< search. Subgoal 2: Variables: Ns VScope TScope TRest T VRest V IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ZV : zip Ns (V::VRest) VScope ZT : zip Ns (T::TRest) TScope VTL : valueType V T VTL1 : valueTypeList VRest TRest * ============================ related_all_scopes [TScope] [VScope]
< ZV: case ZV. Subgoal 2: Variables: TScope TRest T VRest V Rest A ARest IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] ZT : zip (A::ARest) (T::TRest) TScope VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ============================ related_all_scopes [TScope] [(A, V)::Rest]
< ZT: case ZT. Subgoal 2: Variables: TRest T VRest V Rest A ARest Rest1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 ============================ related_all_scopes [(A, T)::Rest1] [(A, V)::Rest]
< R: apply IH to VTL1 ZV ZT. Subgoal 2: Variables: TRest T VRest V Rest A ARest Rest1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : related_all_scopes [Rest1] [Rest] ============================ related_all_scopes [(A, T)::Rest1] [(A, V)::Rest]
< R: case R. Subgoal 2: Variables: TRest T VRest V Rest A ARest Rest1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] ============================ related_all_scopes [(A, T)::Rest1] [(A, V)::Rest]
< unfold . Subgoal 2.1: Variables: TRest T VRest V Rest A ARest Rest1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] ============================ forall X T1, lookup ((A, T)::Rest1) X T1 -> exists V1, lookup ((A, V)::Rest) X V1 /\ valueType V1 T1
< intros L. Subgoal 2.1: Variables: TRest T VRest V Rest A ARest Rest1 X T1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] L : lookup ((A, T)::Rest1) X T1 ============================ exists V1, lookup ((A, V)::Rest) X V1 /\ valueType V1 T1
< L: case L. Subgoal 2.1.1: Variables: TRest VRest V Rest ARest Rest1 X T1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T1 VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] ============================ exists V1, lookup ((X, V)::Rest) X V1 /\ valueType V1 T1
< search. Subgoal 2.1.2: Variables: TRest T VRest V Rest A ARest Rest1 X T1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] L : A = X -> false L1 : lookup Rest1 X T1 ============================ exists V1, lookup ((A, V)::Rest) X V1 /\ valueType V1 T1
< apply R to L1. Subgoal 2.1.2: Variables: TRest T VRest V Rest A ARest Rest1 X T1 V1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] L : A = X -> false L1 : lookup Rest1 X T1 H1 : lookup Rest X V1 H2 : valueType V1 T1 ============================ exists V1, lookup ((A, V)::Rest) X V1 /\ valueType V1 T1
< search. Subgoal 2.2: Variables: TRest T VRest V Rest A ARest Rest1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] ============================ forall X, no_lookup ((A, T)::Rest1) X -> no_lookup ((A, V)::Rest) X
< intros N. Subgoal 2.2: Variables: TRest T VRest V Rest A ARest Rest1 X IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] N : no_lookup ((A, T)::Rest1) X ============================ no_lookup ((A, V)::Rest) X
< N: case N. Subgoal 2.2: Variables: TRest T VRest V Rest A ARest Rest1 X IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] N : A = X -> false N1 : no_lookup Rest1 X ============================ no_lookup ((A, V)::Rest) X
< apply R1 to N1. Subgoal 2.2: Variables: TRest T VRest V Rest A ARest Rest1 X IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] N : A = X -> false N1 : no_lookup Rest1 X H1 : no_lookup Rest X ============================ no_lookup ((A, V)::Rest) X
< search. Subgoal 2.3: Variables: TRest T VRest V Rest A ARest Rest1 IH : forall Vs Tys Ns VScope TScope, valueTypeList Vs Tys * -> zip Ns Vs VScope -> zip Ns Tys TScope -> related_all_scopes [TScope] [VScope] VTL : valueType V T VTL1 : valueTypeList VRest TRest * ZV : zip ARest VRest Rest ZT : zip ARest TRest Rest1 R : forall X T, lookup Rest1 X T -> exists V, lookup Rest X V /\ valueType V T R1 : forall X, no_lookup Rest1 X -> no_lookup Rest X R2 : related_all_scopes [] [] ============================ related_all_scopes [] []
< search. Proof completed.
< Theorem valFieldTys_lookup : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty. ============================ forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty
< induction on 1. IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty ============================ forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys @ -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty
< intros VFT LV LT. Variables: Fields FieldTys F V Ty IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty VFT : valFieldTys Fields FieldTys @ LV : lookup Fields F V LT : lookupRecFieldTy FieldTys F Ty ============================ valueType V Ty
< VFT: case VFT. Subgoal 1: Variables: F V Ty IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty LV : lookup [] F V LT : lookupRecFieldTy nilRecFieldTys F Ty ============================ valueType V Ty
< case LV. Subgoal 2: Variables: F V Ty RestTys Ty1 F1 Rest V1 IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty LV : lookup ((F1, V1)::Rest) F V LT : lookupRecFieldTy (consRecFieldTys F1 Ty1 RestTys) F Ty VFT : valueType V1 Ty1 * VFT1 : valFieldTys Rest RestTys * ============================ valueType V Ty
< LV: case LV. Subgoal 2.1: Variables: F V Ty RestTys Ty1 Rest IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty LT : lookupRecFieldTy (consRecFieldTys F Ty1 RestTys) F Ty VFT : valueType V Ty1 * VFT1 : valFieldTys Rest RestTys * ============================ valueType V Ty
< LT: case LT. Subgoal 2.1.1: Variables: F V Ty RestTys Rest IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty VFT : valueType V Ty * VFT1 : valFieldTys Rest RestTys * ============================ valueType V Ty
< search. Subgoal 2.1.2: Variables: F V Ty RestTys Ty1 Rest IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty VFT : valueType V Ty1 * VFT1 : valFieldTys Rest RestTys * LT : F = F -> false LT1 : lookupRecFieldTy RestTys F Ty ============================ valueType V Ty
< apply LT to _. Subgoal 2.2: Variables: F V Ty RestTys Ty1 F1 Rest V1 IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty LT : lookupRecFieldTy (consRecFieldTys F1 Ty1 RestTys) F Ty VFT : valueType V1 Ty1 * VFT1 : valFieldTys Rest RestTys * LV : F1 = F -> false LV1 : lookup Rest F V ============================ valueType V Ty
< LT: case LT. Subgoal 2.2.1: Variables: F V Ty RestTys Rest V1 IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty VFT : valueType V1 Ty * VFT1 : valFieldTys Rest RestTys * LV : F = F -> false LV1 : lookup Rest F V ============================ valueType V Ty
< apply LV to _. Subgoal 2.2.2: Variables: F V Ty RestTys Ty1 F1 Rest V1 IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty VFT : valueType V1 Ty1 * VFT1 : valFieldTys Rest RestTys * LV : F1 = F -> false LV1 : lookup Rest F V LT : F1 = F -> false LT1 : lookupRecFieldTy RestTys F Ty ============================ valueType V Ty
< apply IH to VFT1 LV1 LT1. Subgoal 2.2.2: Variables: F V Ty RestTys Ty1 F1 Rest V1 IH : forall Fields FieldTys F V Ty, valFieldTys Fields FieldTys * -> lookup Fields F V -> lookupRecFieldTy FieldTys F Ty -> valueType V Ty VFT : valueType V1 Ty1 * VFT1 : valFieldTys Rest RestTys * LV : F1 = F -> false LV1 : lookup Rest F V LT : F1 = F -> false LT1 : lookupRecFieldTy RestTys F Ty H1 : valueType V Ty ============================ valueType V Ty
< search. Proof completed.
< Theorem related_all_scopes_replaceScopes : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE'. ============================ forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE'
< induction on 4. IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' ============================ forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' @ -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE'
< intros IsET IsEE RAS RS LTy VTy. Variables: ET EE X V EE' Ty IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) ET IsEE : is_list (is_list (is_pair is_string is_value)) EE RAS : related_all_scopes ET EE RS : replaceScopes X V EE EE' @ LTy : lookupScopes X ET Ty VTy : valueType V Ty ============================ related_all_scopes ET EE'
< RS: case RS. Subgoal 1: Variables: ET X V Ty I Rest LRemain L IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) ET IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) RAS : related_all_scopes ET (L::Rest) LTy : lookupScopes X ET Ty VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain ============================ related_all_scopes ET (((X, V)::LRemain)::Rest)
< RAS: case RAS. Subgoal 1: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) LTy : lookupScopes X (A::ARest) Ty VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest ============================ related_all_scopes (A::ARest) (((X, V)::LRemain)::Rest)
< LTy: case LTy. Subgoal 1.1: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty ============================ related_all_scopes (A::ARest) (((X, V)::LRemain)::Rest)
< unfold . Subgoal 1.1.1: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty ============================ forall X1 T, lookup A X1 T -> exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< intros L. Subgoal 1.1.1: Variables: X V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< case IsET. Subgoal 1.1.1: Variables: X V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< IsX: apply lookup_is_key_type to _ LTy. Subgoal 1.1.1: Variables: X V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< IsX1: apply lookup_is_key_type to _ L. Subgoal 1.1.1: Variables: X V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X IsX1 : is_string X1 ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< Or: apply is_string_eq_or_not to IsX IsX1. Subgoal 1.1.1: Variables: X V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X IsX1 : is_string X1 Or : X = X1 \/ (X = X1 -> false) ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< E: case Or. Subgoal 1.1.1.1: Variables: V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X1, I) L RS1 : remove_all L X1 LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X1 Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X1 IsX1 : is_string X1 ============================ exists V1, lookup ((X1, V)::LRemain) X1 V1 /\ valueType V1 T
< apply lookup_unique to LTy L. Subgoal 1.1.1.1: Variables: V I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V T RS : mem (X1, I) L RS1 : remove_all L X1 LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X1 T L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X1 IsX1 : is_string X1 ============================ exists V1, lookup ((X1, V)::LRemain) X1 V1 /\ valueType V1 T
< search. Subgoal 1.1.1.2: Variables: X V Ty I Rest LRemain L ARest A X1 T IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X IsX1 : is_string X1 E : X = X1 -> false ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< LNew: apply RAS to L. Subgoal 1.1.1.2: Variables: X V Ty I Rest LRemain L ARest A X1 T V1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X IsX1 : is_string X1 E : X = X1 -> false LNew : lookup L X1 V1 LNew1 : valueType V1 T ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< apply remove_all_lookup_other_back to RS1 LNew _. Subgoal 1.1.1.2: Variables: X V Ty I Rest LRemain L ARest A X1 T V1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty L : lookup A X1 T H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest IsX : is_string X IsX1 : is_string X1 E : X = X1 -> false LNew : lookup L X1 V1 LNew1 : valueType V1 T H3 : lookup LRemain X1 V1 ============================ exists V1, lookup ((X, V)::LRemain) X1 V1 /\ valueType V1 T
< search. Subgoal 1.1.2: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty ============================ forall X1, no_lookup A X1 -> no_lookup ((X, V)::LRemain) X1
< intros N. Subgoal 1.1.2: Variables: X V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty N : no_lookup A X1 ============================ no_lookup ((X, V)::LRemain) X1
< unfold . Subgoal 1.1.2.1: Variables: X V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty N : no_lookup A X1 ============================ X = X1 -> false
< intros E. Subgoal 1.1.2.1: Variables: X V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty N : no_lookup A X1 E : X = X1 ============================ false
< case E. Subgoal 1.1.2.1: Variables: V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X1, I) L RS1 : remove_all L X1 LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X1 Ty N : no_lookup A X1 ============================ false
< apply no_lookup to N LTy. Subgoal 1.1.2.2: Variables: X V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty N : no_lookup A X1 ============================ no_lookup LRemain X1
< N': apply RAS1 to N. Subgoal 1.1.2.2: Variables: X V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty N : no_lookup A X1 N' : no_lookup L X1 ============================ no_lookup LRemain X1
< apply remove_all_no_lookup_back to RS1 N'. Subgoal 1.1.2.2: Variables: X V Ty I Rest LRemain L ARest A X1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty N : no_lookup A X1 N' : no_lookup L X1 H1 : no_lookup LRemain X1 ============================ no_lookup LRemain X1
< search. Subgoal 1.1.3: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty ============================ related_all_scopes ARest Rest
< search. Subgoal 1.2: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : no_lookup A X LTy1 : lookupScopes X ARest Ty ============================ related_all_scopes (A::ARest) (((X, V)::LRemain)::Rest)
< N: apply RAS1 to LTy. Subgoal 1.2: Variables: X V Ty I Rest LRemain L ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : mem (X, I) L RS1 : remove_all L X LRemain RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : no_lookup A X LTy1 : lookupScopes X ARest Ty N : no_lookup L X ============================ related_all_scopes (A::ARest) (((X, V)::LRemain)::Rest)
< apply no_lookup_mem to N RS. Subgoal 2: Variables: ET X V Ty New L Rest IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) ET IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) RAS : related_all_scopes ET (L::Rest) LTy : lookupScopes X ET Ty VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * ============================ related_all_scopes ET (L::New)
< RAS: case RAS. Subgoal 2: Variables: X V Ty New L Rest ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) LTy : lookupScopes X (A::ARest) Ty VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest ============================ related_all_scopes (A::ARest) (L::New)
< LTy: case LTy. Subgoal 2.1: Variables: X V Ty New L Rest ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty ============================ related_all_scopes (A::ARest) (L::New)
< apply RAS to LTy. Subgoal 2.1: Variables: X V Ty New L Rest ARest A V1 IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : lookup A X Ty H1 : lookup L X V1 H2 : valueType V1 Ty ============================ related_all_scopes (A::ARest) (L::New)
< apply no_lookup to RS _. Subgoal 2.2: Variables: X V Ty New L Rest ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsET : is_list (is_list (is_pair is_string is_typ)) (A::ARest) IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : no_lookup A X LTy1 : lookupScopes X ARest Ty ============================ related_all_scopes (A::ARest) (L::New)
< case IsET. Subgoal 2.2: Variables: X V Ty New L Rest ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' IsEE : is_list (is_list (is_pair is_string is_value)) (L::Rest) VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : no_lookup A X LTy1 : lookupScopes X ARest Ty H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest ============================ related_all_scopes (A::ARest) (L::New)
< case IsEE. Subgoal 2.2: Variables: X V Ty New L Rest ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : no_lookup A X LTy1 : lookupScopes X ARest Ty H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) Rest ============================ related_all_scopes (A::ARest) (L::New)
< apply IH to _ _ RAS2 RS1 LTy1 _. Subgoal 2.2: Variables: X V Ty New L Rest ARest A IH : forall ET EE X V EE' Ty, is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_list (is_pair is_string is_value)) EE -> related_all_scopes ET EE -> replaceScopes X V EE EE' * -> lookupScopes X ET Ty -> valueType V Ty -> related_all_scopes ET EE' VTy : valueType V Ty RS : no_lookup L X RS1 : replaceScopes X V Rest New * RAS : forall X T, lookup A X T -> exists V, lookup L X V /\ valueType V T RAS1 : forall X, no_lookup A X -> no_lookup L X RAS2 : related_all_scopes ARest Rest LTy : no_lookup A X LTy1 : lookupScopes X ARest Ty H1 : is_list (is_pair is_string is_typ) A H2 : is_list (is_list (is_pair is_string is_typ)) ARest H3 : is_list (is_pair is_string is_value) L H4 : is_list (is_list (is_pair is_string is_value)) Rest H5 : related_all_scopes ARest New ============================ related_all_scopes (A::ARest) (L::New)
< search. Proof completed.
< Theorem replaceRecVal_typePres : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' -> valFieldTys L' Tys. ============================ forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' -> valFieldTys L' Tys
< induction on 4. IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys ============================ forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' @ -> valFieldTys L' Tys
< intros VFT L VTy RRV. Variables: L Tys F VTy V L' IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VFT : valFieldTys L Tys L : lookupRecFieldTy Tys F VTy VTy : valueType V VTy RRV : replaceRecVal F V L L' @ ============================ valFieldTys L' Tys
< RRV: case RRV. Subgoal 1: Variables: Tys F VTy V Rest VOld IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VFT : valFieldTys ((F, VOld)::Rest) Tys L : lookupRecFieldTy Tys F VTy VTy : valueType V VTy ============================ valFieldTys ((F, V)::Rest) Tys
< case VFT. Subgoal 1: Variables: F VTy V Rest VOld RestTys Ty IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys L : lookupRecFieldTy (consRecFieldTys F Ty RestTys) F VTy VTy : valueType V VTy H1 : valueType VOld Ty H2 : valFieldTys Rest RestTys ============================ valFieldTys ((F, V)::Rest) (consRecFieldTys F Ty RestTys)
< L: case L. Subgoal 1.1: Variables: F VTy V Rest VOld RestTys IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VTy : valueType V VTy H1 : valueType VOld VTy H2 : valFieldTys Rest RestTys ============================ valFieldTys ((F, V)::Rest) (consRecFieldTys F VTy RestTys)
< search. Subgoal 1.2: Variables: F VTy V Rest VOld RestTys Ty IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VTy : valueType V VTy H1 : valueType VOld Ty H2 : valFieldTys Rest RestTys L : F = F -> false L1 : lookupRecFieldTy RestTys F VTy ============================ valFieldTys ((F, V)::Rest) (consRecFieldTys F Ty RestTys)
< apply L to _. Subgoal 2: Variables: Tys F VTy V RRest VO O Rest IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VFT : valFieldTys ((O, VO)::Rest) Tys L : lookupRecFieldTy Tys F VTy VTy : valueType V VTy RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * ============================ valFieldTys ((O, VO)::RRest) Tys
< VFT: case VFT. Subgoal 2: Variables: F VTy V RRest VO O Rest RestTys Ty IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys L : lookupRecFieldTy (consRecFieldTys O Ty RestTys) F VTy VTy : valueType V VTy RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * VFT : valueType VO Ty VFT1 : valFieldTys Rest RestTys ============================ valFieldTys ((O, VO)::RRest) (consRecFieldTys O Ty RestTys)
< L: case L. Subgoal 2.1: Variables: F VTy V RRest VO Rest RestTys IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VTy : valueType V VTy RRV : F = F -> false RRV1 : replaceRecVal F V Rest RRest * VFT : valueType VO VTy VFT1 : valFieldTys Rest RestTys ============================ valFieldTys ((F, VO)::RRest) (consRecFieldTys F VTy RestTys)
< apply RRV to _. Subgoal 2.2: Variables: F VTy V RRest VO O Rest RestTys Ty IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VTy : valueType V VTy RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * VFT : valueType VO Ty VFT1 : valFieldTys Rest RestTys L : O = F -> false L1 : lookupRecFieldTy RestTys F VTy ============================ valFieldTys ((O, VO)::RRest) (consRecFieldTys O Ty RestTys)
< apply IH to VFT1 L1 VTy RRV1. Subgoal 2.2: Variables: F VTy V RRest VO O Rest RestTys Ty IH : forall L Tys F VTy V L', valFieldTys L Tys -> lookupRecFieldTy Tys F VTy -> valueType V VTy -> replaceRecVal F V L L' * -> valFieldTys L' Tys VTy : valueType V VTy RRV : F = O -> false RRV1 : replaceRecVal F V Rest RRest * VFT : valueType VO Ty VFT1 : valFieldTys Rest RestTys L : O = F -> false L1 : lookupRecFieldTy RestTys F VTy H1 : valFieldTys RRest RestTys ============================ valFieldTys ((O, VO)::RRest) (consRecFieldTys O Ty RestTys)
< search. Proof completed.
< Theorem updateRecFields_typePres : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys. ============================ forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys
< induction on 2. IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys ============================ forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out @ -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys
< intros NFT URF VTy VFT. Variables: Fs FTys Ty V FVals Out IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys NFT : nestedFieldTy Fs FTys Ty URF : updateRecFields Fs V FVals Out @ VTy : valueType V Ty VFT : valFieldTys FVals FTys ============================ valFieldTys Out FTys
< URF: case URF. Subgoal 1: Variables: FTys Ty V FVals Out F IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys NFT : nestedFieldTy [F] FTys Ty VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : replaceRecVal F V FVals Out ============================ valFieldTys Out FTys
< NFT: case NFT. Subgoal 1.1: Variables: FTys Ty V FVals Out F IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : replaceRecVal F V FVals Out NFT : lookupRecFieldTy FTys F Ty ============================ valFieldTys Out FTys
< apply replaceRecVal_typePres to _ _ _ URF. Subgoal 1.1: Variables: FTys Ty V FVals Out F IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : replaceRecVal F V FVals Out NFT : lookupRecFieldTy FTys F Ty H1 : valFieldTys Out FTys ============================ valFieldTys Out FTys
< search. Subgoal 1.2: Variables: FTys Ty V FVals Out F NextFields IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : replaceRecVal F V FVals Out NFT : lookupRecFieldTy FTys F (recTy NextFields) NFT1 : nestedFieldTy [] NextFields Ty ============================ valFieldTys Out FTys
< case NFT1. Subgoal 2: Variables: FTys Ty V FVals Out Fields Updated FRest F IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys NFT : nestedFieldTy (F::FRest) FTys Ty VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields FRest V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out ============================ valFieldTys Out FTys
< NFT: case NFT. Subgoal 2.1: Variables: FTys Ty V FVals Out Fields Updated F IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields [] V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out NFT : lookupRecFieldTy FTys F Ty ============================ valFieldTys Out FTys
< case URF1. Subgoal 2.2: Variables: FTys Ty V FVals Out Fields Updated FRest F NextFields IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields FRest V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out NFT : lookupRecFieldTy FTys F (recTy NextFields) NFT1 : nestedFieldTy FRest NextFields Ty ============================ valFieldTys Out FTys
< RVTy: apply valFieldTys_lookup to VFT URF NFT. Subgoal 2.2: Variables: FTys Ty V FVals Out Fields Updated FRest F NextFields IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields FRest V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out NFT : lookupRecFieldTy FTys F (recTy NextFields) NFT1 : nestedFieldTy FRest NextFields Ty RVTy : valueType (recVal Fields) (recTy NextFields) ============================ valFieldTys Out FTys
< case RVTy. Subgoal 2.2: Variables: FTys Ty V FVals Out Fields Updated FRest F NextFields IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields FRest V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out NFT : lookupRecFieldTy FTys F (recTy NextFields) NFT1 : nestedFieldTy FRest NextFields Ty H1 : valFieldTys Fields NextFields ============================ valFieldTys Out FTys
< apply IH to NFT1 URF1 VTy _. Subgoal 2.2: Variables: FTys Ty V FVals Out Fields Updated FRest F NextFields IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields FRest V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out NFT : lookupRecFieldTy FTys F (recTy NextFields) NFT1 : nestedFieldTy FRest NextFields Ty H1 : valFieldTys Fields NextFields H2 : valFieldTys Updated NextFields ============================ valFieldTys Out FTys
< apply replaceRecVal_typePres to _ _ _ URF2. Subgoal 2.2: Variables: FTys Ty V FVals Out Fields Updated FRest F NextFields IH : forall Fs FTys Ty V FVals Out, nestedFieldTy Fs FTys Ty -> updateRecFields Fs V FVals Out * -> valueType V Ty -> valFieldTys FVals FTys -> valFieldTys Out FTys VTy : valueType V Ty VFT : valFieldTys FVals FTys URF : lookup FVals F (recVal Fields) URF1 : updateRecFields FRest V Fields Updated * URF2 : replaceRecVal F (recVal Updated) FVals Out NFT : lookupRecFieldTy FTys F (recTy NextFields) NFT1 : nestedFieldTy FRest NextFields Ty H1 : valFieldTys Fields NextFields H2 : valFieldTys Updated NextFields H3 : valFieldTys Out FTys ============================ valFieldTys Out FTys
< search. Proof completed.
< Extensible_Theorem evalExpr_typePres_ctx : forall E FT ET Ty FE EE EE' O V, IsE : is_expr E -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : typeOf FT ET E Ty -> Ev : evalExpr FE EE E V EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> related_all_scopes ET EE' on Ev as IH_C_E, evalExpr_typePres : forall E FT ET Ty FE EE EE' O V, IsE : is_expr E -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : typeOf FT ET E Ty -> Ev : evalExpr FE EE E V EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> valueType V Ty on Ev as IH_T_E, evalStmt_typePres : forall S FT ET ET' FE EE EE' O, IsS : is_stmt S -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : stmtOK FT ET S ET' -> Ev : evalStmt FE EE S EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> related_all_scopes ET' EE' on Ev as IH_C_S, evalArgs_typePres_Ctx : forall A FT ET Tys FE EE EE' O Vs, IsA : is_args A -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : typeOfArgs FT ET A Tys -> Ev : evalArgs FE EE A Vs EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> related_all_scopes ET EE' on Ev as IH_C_A, evalArgs_typePres : forall A FT ET Tys FE EE EE' O Vs, IsA : is_args A -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : typeOfArgs FT ET A Tys -> Ev : evalArgs FE EE A Vs EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> valueTypeList Vs Tys on Ev as IH_T_A, evalRecFields_typePres_Ctx : forall RF FT ET FTys FE EE EE' O FVs, IsRF : is_recFieldExprs RF -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : typeOfRecFields FT ET RF FTys -> Ev : evalRecFields FE EE RF FVs EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> related_all_scopes ET EE' on Ev as IH_C_RF, evalRecFields_typePres : forall RF FT ET FTys FE EE EE' O FVs, IsRF : is_recFieldExprs RF -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : typeOfRecFields FT ET RF FTys -> Ev : evalRecFields FE EE RF FVs EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> valFieldTys FVs FTys on Ev as IH_T_RF. Subgoal 1.1: Variables: FT ET Ty FE EE' I IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (num I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (num I) Ty Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.2: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (plus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (plus E1 E2) Ty Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.2: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (plus E1 E2) Ty Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.2: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.2: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.2: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.2: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.3: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (minus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (minus E1 E2) Ty Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.3: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (minus E1 E2) Ty Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.3: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.3: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.3: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.3: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.4: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (mult E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (mult E1 E2) Ty Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.4: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (mult E1 E2) Ty Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.4: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.4: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.4: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.4: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.5: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (div E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (div E1 E2) Ty Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.5: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (div E1 E2) Ty Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.5: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.5: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.5: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.5: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.6: Variables: FT ET Ty FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr true IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET true Ty Ev : evalExpr FE EE' true trueVal EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.7: Variables: FT ET Ty FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr false IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET false Ty Ev : evalExpr FE EE' false falseVal EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.8: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.8: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.8: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.8: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.8: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.8: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.9: Variables: FT ET Ty FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.9: Variables: FT ET Ty FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.9: Variables: FT ET FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.9: Variables: FT ET FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.10: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.10: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.10: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.10: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.10: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.10: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.11: Variables: FT ET Ty FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.11: Variables: FT ET Ty FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.11: Variables: FT ET FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.11: Variables: FT ET FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.12: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.12: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.12: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.12: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.12: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.12: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.13: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.13: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.13: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.13: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.13: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.13: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.14: Variables: FT ET Ty FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (not E1) Ty Ev : evalExpr FE EE (not E1) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.14: Variables: FT ET Ty FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (not E1) Ty Ev : evalExpr FE EE (not E1) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.14: Variables: FT ET FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.14: Variables: FT ET FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 boolTy H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.15: Variables: FT ET Ty FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (not E1) Ty Ev : evalExpr FE EE (not E1) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.15: Variables: FT ET Ty FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (not E1) Ty Ev : evalExpr FE EE (not E1) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.15: Variables: FT ET FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.15: Variables: FT ET FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 boolTy H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.16: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (greater E1 E2) Ty Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.16: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (greater E1 E2) Ty Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.16: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.16: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.16: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.16: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.17: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (greater E1 E2) Ty Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.17: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (greater E1 E2) Ty Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.17: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.17: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.17: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.17: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.18: Variables: FT ET Ty FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (eq E1 E2) Ty Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.18: Variables: FT ET Ty FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (eq E1 E2) Ty Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.18.1: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.18.1: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18.1: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.18.1: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.18.2: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.18.2: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18.2: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.18.2: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.18.3: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.18.3: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18.3: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.18.3: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.19: Variables: FT ET Ty FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (eq E1 E2) Ty Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.19: Variables: FT ET Ty FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (eq E1 E2) Ty Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.19.1: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.19.1: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19.1: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.19.1: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 intTy Ty1 : typeOf FT ET E2 intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.19.2: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.19.2: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19.2: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.19.2: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 boolTy Ty1 : typeOf FT ET E2 boolTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.19.3: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.19.3: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19.3: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.19.3: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.20: Variables: FT ET Ty FE EE' S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (stringLit S) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (stringLit S) Ty Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.21: Variables: FT ET Ty FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (appString E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (appString E1 E2) Ty Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.21: Variables: FT ET Ty FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (appString E1 E2) Ty Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.21: Variables: FT ET FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.21: Variables: FT ET FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.21: Variables: FT ET FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.21: Variables: FT ET FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 stringTy Ty1 : typeOf FT ET E2 stringTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.22: Variables: FT ET Ty FE EE' V X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (name X) Ty Ev : evalExpr FE EE' (name X) V EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' Ev1 : lookupScopes X EE' V ============================ related_all_scopes ET EE'
< search. Subgoal 1.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (call Fun Args) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (call Fun Args) Ty Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (call Fun Args) Ty Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys ============================ related_all_scopes ET EE'
< apply IH_C_A to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys H3 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (stmtExpr S E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (stmtExpr S E1) Ty Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (stmtExpr S E1) Ty Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty ============================ related_all_scopes ET EE'
< apply IH_C_S to _ _ _ _ _ Ty Ev1 _ _. Subgoal 1.24.1: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty ============================ related_all_scopes ([]::ET) ([]::EE)
< unfold . Subgoal 1.24.1.1: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty ============================ forall X T, lookup [] X T -> exists V, lookup [] X V /\ valueType V T
< intros L. Subgoal 1.24.1.1: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 X T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty L : lookup [] X T ============================ exists V, lookup [] X V /\ valueType V T
< case L. Subgoal 1.24.1.2: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty ============================ forall X, no_lookup [] X -> no_lookup [] X
< intros. Subgoal 1.24.1.2: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty H3 : no_lookup [] X ============================ no_lookup [] X
< search. Subgoal 1.24.1.3: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty ============================ related_all_scopes ET EE
< search. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty H3 : related_all_scopes TC1 EE3 ============================ related_all_scopes ET EE'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty H3 : related_all_scopes TC1 EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply stmtOK_isCtx to _ _ _ Ty. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty H3 : related_all_scopes TC1 EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ related_all_scopes ET EE'
< R: apply IH_C_E to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty H3 : related_all_scopes TC1 EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_typ)) TC1 R : related_all_scopes TC1 (Scope::EE') ============================ related_all_scopes ET EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes (Scope'::ET) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) R : related_all_scopes (Scope'::ET) (Scope::EE') ============================ related_all_scopes ET EE'
< R: case R. Subgoal 1.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes (Scope'::ET) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) R : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope' X -> no_lookup Scope X R2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.25: Variables: FT ET Ty FE EE EE' O VF RF IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (recBuild RF) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recBuild RF) Ty Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.25: Variables: FT ET Ty FE EE EE' O VF RF IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recBuild RF) Ty Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.25: Variables: FT ET FE EE EE' O VF RF FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Ty : typeOfRecFields FT ET RF FieldTys ============================ related_all_scopes ET EE'
< apply IH_C_RF to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.25: Variables: FT ET FE EE EE' O VF RF FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Ty : typeOfRecFields FT ET RF FieldTys H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (recFieldAccess Rec F) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recFieldAccess Rec F) Ty Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recFieldAccess Rec F) Ty Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Ty : typeOf FT ET Rec (recTy FieldTys) Ty1 : lookupRecFieldTy FieldTys F Ty ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Ty : typeOf FT ET Rec (recTy FieldTys) Ty1 : lookupRecFieldTy FieldTys F Ty H3 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 2.1: Variables: FT ET Ty FE EE' I IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (num I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (num I) Ty Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType (intVal I) Ty
< case Ty. Subgoal 2.1: Variables: FT ET FE EE' I IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (num I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType (intVal I) intTy
< search. Subgoal 2.2: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (plus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (plus E1 E2) Ty Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ valueType (intVal I) Ty
< case Ty. Subgoal 2.2: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (plus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType (intVal I) intTy
< search. Subgoal 2.3: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (minus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (minus E1 E2) Ty Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ valueType (intVal I) Ty
< case Ty. Subgoal 2.3: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (minus E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType (intVal I) intTy
< search. Subgoal 2.4: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (mult E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (mult E1 E2) Ty Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ valueType (intVal I) Ty
< case Ty. Subgoal 2.4: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (mult E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType (intVal I) intTy
< search. Subgoal 2.5: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (div E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (div E1 E2) Ty Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ valueType (intVal I) Ty
< case Ty. Subgoal 2.5: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (div E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType (intVal I) intTy
< search. Subgoal 2.6: Variables: FT ET Ty FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr true IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET true Ty Ev : evalExpr FE EE' true trueVal EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType trueVal Ty
< case Ty. Subgoal 2.6: Variables: FT ET FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr true IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' true trueVal EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType trueVal boolTy
< search. Subgoal 2.7: Variables: FT ET Ty FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr false IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET false Ty Ev : evalExpr FE EE' false falseVal EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType falseVal Ty
< case Ty. Subgoal 2.7: Variables: FT ET FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr false IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' false falseVal EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType falseVal boolTy
< search. Subgoal 2.8: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType trueVal Ty
< case Ty. Subgoal 2.8: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType trueVal boolTy
< search. Subgoal 2.9: Variables: FT ET Ty FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ valueType falseVal Ty
< case Ty. Subgoal 2.9: Variables: FT ET FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType falseVal boolTy
< search. Subgoal 2.10: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (and E1 E2) Ty Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType falseVal Ty
< case Ty. Subgoal 2.10: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (and E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType falseVal boolTy
< search. Subgoal 2.11: Variables: FT ET Ty FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ valueType trueVal Ty
< case Ty. Subgoal 2.11: Variables: FT ET FE EE EE' O E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType trueVal boolTy
< search. Subgoal 2.12: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType trueVal Ty
< case Ty. Subgoal 2.12: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType trueVal boolTy
< search. Subgoal 2.13: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (or E1 E2) Ty Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType falseVal Ty
< case Ty. Subgoal 2.13: Variables: FT ET FE EE EE' O EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (or E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType falseVal boolTy
< search. Subgoal 2.14: Variables: FT ET Ty FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (not E1) Ty Ev : evalExpr FE EE (not E1) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ valueType trueVal Ty
< case Ty. Subgoal 2.14: Variables: FT ET FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : typeOf FT ET E1 boolTy ============================ valueType trueVal boolTy
< search. Subgoal 2.15: Variables: FT ET Ty FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (not E1) Ty Ev : evalExpr FE EE (not E1) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ valueType falseVal Ty
< case Ty. Subgoal 2.15: Variables: FT ET FE EE EE' O E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (not E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : typeOf FT ET E1 boolTy ============================ valueType falseVal boolTy
< search. Subgoal 2.16: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (greater E1 E2) Ty Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ valueType trueVal Ty
< case Ty. Subgoal 2.16: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType trueVal boolTy
< search. Subgoal 2.17: Variables: FT ET Ty FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (greater E1 E2) Ty Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ valueType falseVal Ty
< case Ty. Subgoal 2.17: Variables: FT ET FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (greater E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType falseVal boolTy
< search. Subgoal 2.18: Variables: FT ET Ty FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (eq E1 E2) Ty Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType trueVal Ty
< case Ty. Subgoal 2.18.1: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType trueVal boolTy
< search. Subgoal 2.18.2: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType trueVal boolTy
< search. Subgoal 2.18.3: Variables: FT ET FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : typeOf FT ET E1 stringTy H2 : typeOf FT ET E2 stringTy ============================ valueType trueVal boolTy
< search. Subgoal 2.19: Variables: FT ET Ty FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (eq E1 E2) Ty Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ valueType falseVal Ty
< case Ty. Subgoal 2.19.1: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 intTy H2 : typeOf FT ET E2 intTy ============================ valueType falseVal boolTy
< search. Subgoal 2.19.2: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 boolTy H2 : typeOf FT ET E2 boolTy ============================ valueType falseVal boolTy
< search. Subgoal 2.19.3: Variables: FT ET FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (eq E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 stringTy H2 : typeOf FT ET E2 stringTy ============================ valueType falseVal boolTy
< search. Subgoal 2.20: Variables: FT ET Ty FE EE' S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (stringLit S) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (stringLit S) Ty Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType (stringVal S) Ty
< case Ty. Subgoal 2.20: Variables: FT ET FE EE' S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (stringLit S) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType (stringVal S) stringTy
< search. Subgoal 2.21: Variables: FT ET Ty FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (appString E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (appString E1 E2) Ty Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ valueType (stringVal S) Ty
< case Ty. Subgoal 2.21: Variables: FT ET FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (appString E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : typeOf FT ET E1 stringTy H2 : typeOf FT ET E2 stringTy ============================ valueType (stringVal S) stringTy
< search. Subgoal 2.22: Variables: FT ET Ty FE EE' V X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (name X) Ty Ev : evalExpr FE EE' (name X) V EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' Ev1 : lookupScopes X EE' V ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.22: Variables: FT ET Ty FE EE' V X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' Ev1 : lookupScopes X EE' V Ty : lookupScopes X ET Ty ============================ valueType V Ty
< apply related_all_scopes_lookupScopes to _ Ty Ev1. Subgoal 2.22: Variables: FT ET Ty FE EE' V X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (name X) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' Ev1 : lookupScopes X EE' V Ty : lookupScopes X ET Ty H1 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (call Fun Args) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (call Fun Args) Ty Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ valueType V Ty
< case IsE. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (call Fun Args) Ty Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys ============================ valueType V Ty
< F: apply Funs to Ty Ev1. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' ============================ valueType V Ty
< IsP: apply lookup_is_value_funCtx to _ Ev1. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' IsP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ valueType V Ty
< Is: case IsP. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ valueType V Ty
< Is: case Is1. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ valueType V Ty
< Is: case Is2. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body ============================ valueType V Ty
< apply evalArgs_isValue to _ _ _ Ev2. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals ============================ valueType V Ty
< apply zip_is_string_value to _ _ Ev3. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv ============================ valueType V Ty
< IsP: apply lookup_is_value_funTyCtx to _ Ty. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv IsP : is_pair is_typ (is_list is_typ) (Ty, ArgTys) ============================ valueType V Ty
< case IsP. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys ============================ valueType V Ty
< apply zip_is_string_ty to _ _ F. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope ============================ valueType V Ty
< VTL: apply IH_T_A to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys ============================ valueType V Ty
< VTL': assert valueTypeList (RVVal::ArgVals) (Ty::ArgTys). Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ============================ valueType V Ty
< ZE: assert zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv). Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ============================ valueType V Ty
< ZT: assert zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope). Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ZT : zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope) ============================ valueType V Ty
< apply valueTypeList_related_all_scopes to VTL' ZE ZT. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ZT : zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope) H8 : related_all_scopes [(RetVar, Ty)::Scope] [(RetVar, RVVal)::InitEnv] ============================ valueType V Ty
< R: apply IH_C_S to _ _ _ _ _ F2 Ev4 _ _. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope TyEnv' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body TyEnv' Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ZT : zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope) H8 : related_all_scopes [(RetVar, Ty)::Scope] [(RetVar, RVVal)::InitEnv] R : related_all_scopes TyEnv' EE3 ============================ valueType V Ty
< apply stmtOK_older_scopes_same to _ _ _ F2. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body [Scope'] Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ZT : zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope) H8 : related_all_scopes [(RetVar, Ty)::Scope] [(RetVar, RVVal)::InitEnv] R : related_all_scopes [Scope'] EE3 ============================ valueType V Ty
< apply stmtOK_first_scope_lookup_same to _ _ _ F2 _. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body [Scope'] Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ZT : zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope) H8 : related_all_scopes [(RetVar, Ty)::Scope] [(RetVar, RVVal)::InitEnv] R : related_all_scopes [Scope'] EE3 H9 : lookup Scope' RetVar Ty ============================ valueType V Ty
< apply related_all_scopes_lookupScopes to R _ Ev6. Subgoal 2.23: Variables: FT ET Ty FE EE EE' O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgTys Scope Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Ty : lookup FT Fun (Ty, ArgTys) Ty1 : typeOfArgs FT ET Args ArgTys F : zip ArgNames ArgTys Scope F1 : valueType RVVal Ty F2 : stmtOK FT [(RetVar, Ty)::Scope] Body [Scope'] Is : is_string RetVar Is1 : is_value RVVal Is2 : is_list is_string ArgNames Is3 : is_stmt Body H3 : is_list is_value ArgVals H4 : is_list (is_pair is_string is_value) InitEnv H5 : is_typ Ty H6 : is_list is_typ ArgTys H7 : is_list (is_pair is_string is_typ) Scope VTL : valueTypeList ArgVals ArgTys VTL' : valueTypeList (RVVal::ArgVals) (Ty::ArgTys) ZE : zip (RetVar::ArgNames) (RVVal::ArgVals) ((RetVar, RVVal)::InitEnv) ZT : zip (RetVar::ArgNames) (Ty::ArgTys) ((RetVar, Ty)::Scope) H8 : related_all_scopes [(RetVar, Ty)::Scope] [(RetVar, RVVal)::InitEnv] R : related_all_scopes [Scope'] EE3 H9 : lookup Scope' RetVar Ty H10 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (stmtExpr S E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (stmtExpr S E1) Ty Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ valueType V Ty
< case IsE. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (stmtExpr S E1) Ty Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S TC1 Ty1 : typeOf FT TC1 E1 Ty ============================ valueType V Ty
< apply stmtOK_older_scopes_same to _ _ _ Ty. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty ============================ valueType V Ty
< apply related_all_scopes_add_scope to Ctxs. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes ([]::ET) ([]::EE) ============================ valueType V Ty
< apply IH_C_S to _ _ _ _ _ Ty Ev1 _ _. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes ([]::ET) ([]::EE) H4 : related_all_scopes (Scope'::ET) EE3 ============================ valueType V Ty
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes ([]::ET) ([]::EE) H4 : related_all_scopes (Scope'::ET) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ valueType V Ty
< apply stmtOK_isCtx to _ _ _ Ty. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes ([]::ET) ([]::EE) H4 : related_all_scopes (Scope'::ET) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) ============================ valueType V Ty
< apply IH_T_E to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 2.24: Variables: FT ET Ty FE EE EE' O V EE3 O2 Scope O3 E1 S Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Ty : stmtOK FT ([]::ET) S (Scope'::ET) Ty1 : typeOf FT (Scope'::ET) E1 Ty H3 : related_all_scopes ([]::ET) ([]::EE) H4 : related_all_scopes (Scope'::ET) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) H7 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 2.25: Variables: FT ET Ty FE EE EE' O VF RF IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (recBuild RF) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recBuild RF) Ty Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * ============================ valueType (recVal VF) Ty
< case IsE. Subgoal 2.25: Variables: FT ET Ty FE EE EE' O VF RF IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recBuild RF) Ty Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ valueType (recVal VF) Ty
< Ty: case Ty. Subgoal 2.25: Variables: FT ET FE EE EE' O VF RF FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Ty : typeOfRecFields FT ET RF FieldTys ============================ valueType (recVal VF) (recTy FieldTys)
< apply IH_T_RF to _ _ _ _ _ Ty Ev1 _ _. Subgoal 2.25: Variables: FT ET FE EE EE' O VF RF FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Ty : typeOfRecFields FT ET RF FieldTys H2 : valFieldTys VF FieldTys ============================ valueType (recVal VF) (recTy FieldTys)
< search. Subgoal 2.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (recFieldAccess Rec F) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recFieldAccess Rec F) Ty Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ valueType V Ty
< case IsE. Subgoal 2.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (recFieldAccess Rec F) Ty Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Ty : typeOf FT ET Rec (recTy FieldTys) Ty1 : lookupRecFieldTy FieldTys F Ty ============================ valueType V Ty
< VT: apply IH_T_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 2.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Ty : typeOf FT ET Rec (recTy FieldTys) Ty1 : lookupRecFieldTy FieldTys F Ty VT : valueType (recVal Fields) (recTy FieldTys) ============================ valueType V Ty
< VFT: case VT. Subgoal 2.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Ty : typeOf FT ET Rec (recTy FieldTys) Ty1 : lookupRecFieldTy FieldTys F Ty VFT : valFieldTys Fields FieldTys ============================ valueType V Ty
< apply valFieldTys_lookup to VFT Ev2 Ty1. Subgoal 2.26: Variables: FT ET Ty FE EE EE' O V Fields F Rec FieldTys IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Ty : typeOf FT ET Rec (recTy FieldTys) Ty1 : lookupRecFieldTy FieldTys F Ty VFT : valFieldTys Fields FieldTys H3 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 3.1: Variables: FT ET ET' FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : stmtOK FT ET noop ET' Ev : evalStmt FE EE' noop EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET' EE'
< case Ty. Subgoal 3.1: Variables: FT ET' FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt noop IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalStmt FE EE' noop EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (seq S1 S2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (seq S1 S2) ET' Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (seq S1 S2) ET' Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Ty : stmtOK FT ET S1 TC1 Ty1 : stmtOK FT TC1 S2 ET' ============================ related_all_scopes ET' EE'
< apply IH_C_S to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Ty : stmtOK FT ET S1 TC1 Ty1 : stmtOK FT TC1 S2 ET' H3 : related_all_scopes TC1 EE3 ============================ related_all_scopes ET' EE'
< apply stmtOK_isCtx to _ _ _ Ty. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Ty : stmtOK FT ET S1 TC1 Ty1 : stmtOK FT TC1 S2 ET' H3 : related_all_scopes TC1 EE3 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 ============================ related_all_scopes ET' EE'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Ty : stmtOK FT ET S1 TC1 Ty1 : stmtOK FT TC1 S2 ET' H3 : related_all_scopes TC1 EE3 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET' EE'
< apply IH_C_S to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 3.2: Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Ty : stmtOK FT ET S1 TC1 Ty1 : stmtOK FT TC1 S2 ET' H3 : related_all_scopes TC1 EE3 H4 : is_list (is_list (is_pair is_string is_typ)) TC1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.3: Variables: FT ET ET' FE EE O EE2 Scope V X E Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (declare Ty X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (declare Ty X E) ET' Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ related_all_scopes ET' (((X, V)::Scope)::EE2)
< case IsS. Subgoal 3.3: Variables: FT ET ET' FE EE O EE2 Scope V X E Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (declare Ty X E) ET' Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ related_all_scopes ET' (((X, V)::Scope)::EE2)
< Ty: case Ty. Subgoal 3.3: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< apply IH_T_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.3: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< R: apply IH_C_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.3: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : related_all_scopes (Scope1::RestTC) (Scope::EE2) ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< R: case R. Subgoal 3.3: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< unfold . Subgoal 3.3.1: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ forall X1 T, lookup ((X, Ty)::Scope1) X1 T -> exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< intros L. Subgoal 3.3.1: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : lookup ((X, Ty)::Scope1) X1 T ============================ exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< L: case L. Subgoal 3.3.1.1: Variables: FT FE EE O EE2 Scope V E RestTC Scope1 X1 T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare T X1 E) (((X1, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ T H2 : is_string X1 H3 : is_expr E Ty : no_lookup Scope1 X1 Ty1 : typeOf FT (Scope1::RestTC) E T H4 : valueType V T R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ exists V1, lookup ((X1, V)::Scope) X1 V1 /\ valueType V1 T
< search. Subgoal 3.3.1.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T ============================ exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< apply R to L1. Subgoal 3.3.1.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 T V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H5 : lookup Scope X1 V1 H6 : valueType V1 T ============================ exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< exists V1. Subgoal 3.3.1.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 T V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H5 : lookup Scope X1 V1 H6 : valueType V1 T ============================ lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< split. Subgoal 3.3.1.2.1: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 T V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H5 : lookup Scope X1 V1 H6 : valueType V1 T ============================ lookup ((X, V)::Scope) X1 V1
< search. Subgoal 3.3.1.2.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 T V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H5 : lookup Scope X1 V1 H6 : valueType V1 T ============================ valueType V1 T
< search. Subgoal 3.3.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ forall X1, no_lookup ((X, Ty)::Scope1) X1 -> no_lookup ((X, V)::Scope) X1
< intros N. Subgoal 3.3.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 N : no_lookup ((X, Ty)::Scope1) X1 ============================ no_lookup ((X, V)::Scope) X1
< N: case N. Subgoal 3.3.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 N : X = X1 -> false N1 : no_lookup Scope1 X1 ============================ no_lookup ((X, V)::Scope) X1
< apply R1 to N1. Subgoal 3.3.2: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 X1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 N : X = X1 -> false N1 : no_lookup Scope1 X1 H5 : no_lookup Scope X1 ============================ no_lookup ((X, V)::Scope) X1
< search. Subgoal 3.3.3: Variables: FT FE EE O EE2 Scope V X E Ty RestTC Scope1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H4 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ related_all_scopes RestTC EE2
< search. Subgoal 3.4: Variables: FT ET ET' FE EE EE' O V EE3 E X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (assign X E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (assign X E) ET' Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.4: Variables: FT ET ET' FE EE EE' O V EE3 E X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (assign X E) ET' Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.4: Variables: FT ET' FE EE EE' O V EE3 E X Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Ty : lookupScopes X ET' Ty Ty1 : typeOf FT ET' E Ty ============================ related_all_scopes ET' EE'
< R: apply IH_C_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.4: Variables: FT ET' FE EE EE' O V EE3 E X Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Ty : lookupScopes X ET' Ty Ty1 : typeOf FT ET' E Ty R : related_all_scopes ET' EE3 ============================ related_all_scopes ET' EE'
< apply IH_T_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.4: Variables: FT ET' FE EE EE' O V EE3 E X Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Ty : lookupScopes X ET' Ty Ty1 : typeOf FT ET' E Ty R : related_all_scopes ET' EE3 H3 : valueType V Ty ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.4: Variables: FT ET' FE EE EE' O V EE3 E X Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Ty : lookupScopes X ET' Ty Ty1 : typeOf FT ET' E Ty R : related_all_scopes ET' EE3 H3 : valueType V Ty H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET' EE'
< apply related_all_scopes_replaceScopes to _ _ R Ev2 Ty _. Subgoal 3.4: Variables: FT ET' FE EE EE' O V EE3 E X Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Ty : lookupScopes X ET' Ty Ty1 : typeOf FT ET' E Ty R : related_all_scopes ET' EE3 H3 : valueType V Ty H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.5: Variables: FT ET ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (recUpdate Rec Fields E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (recUpdate Rec Fields E) ET' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.5: Variables: FT ET ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (recUpdate Rec Fields E) ET' Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty ============================ related_all_scopes ET' EE'
< R: apply IH_C_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 ============================ related_all_scopes ET' EE'
< apply IH_T_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 H4 : valueType V Ty ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 H4 : valueType V Ty H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET' EE'
< RFTy: apply related_all_scopes_lookupScopes to Ctxs Ty Ev2. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 H4 : valueType V Ty H5 : is_list (is_list (is_pair is_string is_value)) EE3 RFTy : valueType (recVal FieldVals) (recTy FieldTys) ============================ related_all_scopes ET' EE'
< case RFTy. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 H4 : valueType V Ty H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : valFieldTys FieldVals FieldTys ============================ related_all_scopes ET' EE'
< apply updateRecFields_typePres to Ty2 Ev3 _ _. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 H4 : valueType V Ty H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : valFieldTys FieldVals FieldTys H7 : valFieldTys NewVals FieldTys ============================ related_all_scopes ET' EE'
< apply related_all_scopes_replaceScopes to _ _ R Ev4 Ty _. Subgoal 3.5: Variables: FT ET' FE EE EE' O V EE3 FieldVals NewVals E Fields Rec FieldTys Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Ty : lookupScopes Rec ET' (recTy FieldTys) Ty1 : typeOf FT ET' E Ty Ty2 : nestedFieldTy Fields FieldTys Ty R : related_all_scopes ET' EE3 H4 : valueType V Ty H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : valFieldTys FieldVals FieldTys H7 : valFieldTys NewVals FieldTys H8 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.6: Variables: FT ET ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (ifThenElse Cond Th El) ET' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.6: Variables: FT ET ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (ifThenElse Cond Th El) ET' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl ============================ related_all_scopes ET' EE'
< R: apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET' EE'
< apply related_all_scopes_add_scope to R. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) ============================ related_all_scopes ET' EE'
< R': apply IH_C_S to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) R' : related_all_scopes TCTh (Scope::EE') ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty1. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCEl Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th (Scope'::ET') Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) R' : related_all_scopes (Scope'::ET') (Scope::EE') ============================ related_all_scopes ET' EE'
< case R'. Subgoal 3.6: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCEl Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th (Scope'::ET') Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) H6 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H7 : forall X, no_lookup Scope' X -> no_lookup Scope X H8 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.7: Variables: FT ET ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (ifThenElse Cond Th El) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (ifThenElse Cond Th El) ET' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.7: Variables: FT ET ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (ifThenElse Cond Th El) ET' Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl ============================ related_all_scopes ET' EE'
< R: apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET' EE'
< apply related_all_scopes_add_scope to R. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) ============================ related_all_scopes ET' EE'
< R': apply IH_C_S to _ _ _ _ _ Ty2 Ev2 _ _. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh TCEl IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El TCEl R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) R' : related_all_scopes TCEl (Scope::EE') ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty2. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El (Scope'::ET') R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) R' : related_all_scopes (Scope'::ET') (Scope::EE') ============================ related_all_scopes ET' EE'
< case R'. Subgoal 3.7: Variables: FT ET' FE EE EE' O EE3 O2 Scope O3 El Th Cond TCTh Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Th TCTh Ty2 : stmtOK FT ([]::ET') El (Scope'::ET') R : related_all_scopes ET' EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ([]::ET') ([]::EE3) H6 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H7 : forall X, no_lookup Scope' X -> no_lookup Scope X H8 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.8: Variables: FT ET ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (while Cond Body) ET' Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.8: Variables: FT ET ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (while Cond Body) ET' Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 ============================ related_all_scopes ET' EE'
< R: apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 R : related_all_scopes ET' EE2 ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ related_all_scopes ET' EE'
< apply related_all_scopes_add_scope to R. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) ============================ related_all_scopes ET' EE'
< R': apply IH_C_S to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) R' : related_all_scopes TC2 (Scope::EE4) ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty1. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body (Scope'::ET') R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) R' : related_all_scopes (Scope'::ET') (Scope::EE4) ============================ related_all_scopes ET' EE'
< case R'. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body (Scope'::ET') R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) H5 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H6 : forall X, no_lookup Scope' X -> no_lookup Scope X H7 : related_all_scopes ET' EE4 ============================ related_all_scopes ET' EE'
< Is: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body (Scope'::ET') R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) H5 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H6 : forall X, no_lookup Scope' X -> no_lookup Scope X H7 : related_all_scopes ET' EE4 Is : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ related_all_scopes ET' EE'
< case Is. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body (Scope'::ET') R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) H5 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H6 : forall X, no_lookup Scope' X -> no_lookup Scope X H7 : related_all_scopes ET' EE4 H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ related_all_scopes ET' EE'
< apply IH_C_S to _ _ _ _ _ _ Ev3 _ _. Subgoal 3.8: Variables: FT ET' FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body (Scope'::ET') R : related_all_scopes ET' EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : related_all_scopes ([]::ET') ([]::EE2) H5 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H6 : forall X, no_lookup Scope' X -> no_lookup Scope X H7 : related_all_scopes ET' EE4 H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE4 H10 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.9: Variables: FT ET ET' FE EE EE' O Body Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (while Cond Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (while Cond Body) ET' Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond falseVal EE' O * ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.9: Variables: FT ET ET' FE EE EE' O Body Cond IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (while Cond Body) ET' Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.9: Variables: FT ET' FE EE EE' O Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 ============================ related_all_scopes ET' EE'
< R: apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.9: Variables: FT ET' FE EE EE' O Body Cond TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Ty : typeOf FT ET' Cond boolTy Ty1 : stmtOK FT ([]::ET') Body TC2 R : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.10: Variables: FT ET ET' FE EE EE' O Scope S1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (scopeStmt S1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (scopeStmt S1) ET' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.10: Variables: FT ET ET' FE EE EE' O Scope S1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (scopeStmt S1) ET' Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.10: Variables: FT ET' FE EE EE' O Scope S1 TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 Ty : stmtOK FT ([]::ET') S1 TC2 ============================ related_all_scopes ET' EE'
< apply related_all_scopes_add_scope to Ctxs. Subgoal 3.10: Variables: FT ET' FE EE EE' O Scope S1 TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 Ty : stmtOK FT ([]::ET') S1 TC2 H2 : related_all_scopes ([]::ET') ([]::EE) ============================ related_all_scopes ET' EE'
< R: apply IH_C_S to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.10: Variables: FT ET' FE EE EE' O Scope S1 TC2 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 Ty : stmtOK FT ([]::ET') S1 TC2 H2 : related_all_scopes ([]::ET') ([]::EE) R : related_all_scopes TC2 (Scope::EE') ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty. Subgoal 3.10: Variables: FT ET' FE EE EE' O Scope S1 Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 Ty : stmtOK FT ([]::ET') S1 (Scope'::ET') H2 : related_all_scopes ([]::ET') ([]::EE) R : related_all_scopes (Scope'::ET') (Scope::EE') ============================ related_all_scopes ET' EE'
< case R. Subgoal 3.10: Variables: FT ET' FE EE EE' O Scope S1 Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 Ty : stmtOK FT ([]::ET') S1 (Scope'::ET') H2 : related_all_scopes ([]::ET') ([]::EE) H3 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H4 : forall X, no_lookup Scope' X -> no_lookup Scope X H5 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.11: Variables: FT ET ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.11: Variables: FT ET ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.11.1: Variables: FT ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Ty : typeOf FT ET' E intTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.11.1: Variables: FT ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Ty : typeOf FT ET' E intTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.11.2: Variables: FT ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.11.2: Variables: FT ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.11.3: Variables: FT ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.11.3: Variables: FT ET' FE EE EE' O I O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.12: Variables: FT ET ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.12: Variables: FT ET ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.12.1: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Ty : typeOf FT ET' E intTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.12.1: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Ty : typeOf FT ET' E intTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.12.2: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.12.2: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.12.3: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.12.3: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.13: Variables: FT ET ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.13: Variables: FT ET ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.13.1: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Ty : typeOf FT ET' E intTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.13.1: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Ty : typeOf FT ET' E intTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.13.2: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.13.2: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.13.3: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.13.3: Variables: FT ET' FE EE EE' O O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.14: Variables: FT ET ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (printVal E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.14: Variables: FT ET ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (printVal E) ET' Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.14.1: Variables: FT ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Ty : typeOf FT ET' E intTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.14.1: Variables: FT ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Ty : typeOf FT ET' E intTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.14.2: Variables: FT ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.14.2: Variables: FT ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Ty : typeOf FT ET' E boolTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.14.3: Variables: FT ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.14.3: Variables: FT ET' FE EE EE' O S1 O2 E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Ty : typeOf FT ET' E stringTy H2 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 4.1: Variables: FT ET Tys FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsA : is_args nilArgs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOfArgs FT ET nilArgs Tys Ev : evalArgs FE EE' nilArgs [] EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 4.2: Variables: FT ET Tys FE EE EE' O EE3 O2 O3 VRest V Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsA : is_args (consArgs E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfArgs FT ET (consArgs E Rest) Tys Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsA. Subgoal 4.2: Variables: FT ET Tys FE EE EE' O EE3 O2 O3 VRest V Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfArgs FT ET (consArgs E Rest) Tys Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 4.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 4.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_A to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 4.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 5.1: Variables: FT ET Tys FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsA : is_args nilArgs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOfArgs FT ET nilArgs Tys Ev : evalArgs FE EE' nilArgs [] EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueTypeList [] Tys
< case Ty. Subgoal 5.1: Variables: FT ET FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsA : is_args nilArgs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalArgs FE EE' nilArgs [] EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueTypeList [] []
< search. Subgoal 5.2: Variables: FT ET Tys FE EE EE' O EE3 O2 O3 VRest V Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsA : is_args (consArgs E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfArgs FT ET (consArgs E Rest) Tys Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueTypeList (V::VRest) Tys
< case IsA. Subgoal 5.2: Variables: FT ET Tys FE EE EE' O EE3 O2 O3 VRest V Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfArgs FT ET (consArgs E Rest) Tys Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ valueTypeList (V::VRest) Tys
< Ty: case Ty. Subgoal 5.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys ============================ valueTypeList (V::VRest) (ETy::ETys)
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 5.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 ============================ valueTypeList (V::VRest) (ETy::ETys)
< apply IH_T_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 5.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 H4 : valueType V ETy ============================ valueTypeList (V::VRest) (ETy::ETys)
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 H4 : valueType V ETy H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ valueTypeList (V::VRest) (ETy::ETys)
< apply IH_T_A to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 5.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V Rest E ETys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Ty : typeOf FT ET E ETy Ty1 : typeOfArgs FT ET Rest ETys H3 : related_all_scopes ET EE3 H4 : valueType V ETy H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : valueTypeList VRest ETys ============================ valueTypeList (V::VRest) (ETy::ETys)
< search. Subgoal 6.1: Variables: FT ET FTys FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsRF : is_recFieldExprs nilRecFieldExprs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOfRecFields FT ET nilRecFieldExprs FTys Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 6.2: Variables: FT ET FTys FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfRecFields FT ET (consRecFieldExprs F E Rest) FTys Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsRF. Subgoal 6.2: Variables: FT ET FTys FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfRecFields FT ET (consRecFieldExprs F E Rest) FTys Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 6.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 6.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 6.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_RF to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 6.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 7.1: Variables: FT ET FTys FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsRF : is_recFieldExprs nilRecFieldExprs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOfRecFields FT ET nilRecFieldExprs FTys Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valFieldTys [] FTys
< case Ty. Subgoal 7.1: Variables: FT ET FE EE' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsRF : is_recFieldExprs nilRecFieldExprs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valFieldTys [] nilRecFieldTys
< search. Subgoal 7.2: Variables: FT ET FTys FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfRecFields FT ET (consRecFieldExprs F E Rest) FTys Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ valFieldTys ((F, V)::VRest) FTys
< case IsRF. Subgoal 7.2: Variables: FT ET FTys FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOfRecFields FT ET (consRecFieldExprs F E Rest) FTys Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ valFieldTys ((F, V)::VRest) FTys
< Ty: case Ty. Subgoal 7.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys ============================ valFieldTys ((F, V)::VRest) (consRecFieldTys F ETy RestTys)
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 7.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 ============================ valFieldTys ((F, V)::VRest) (consRecFieldTys F ETy RestTys)
< apply IH_T_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 7.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 H5 : valueType V ETy ============================ valFieldTys ((F, V)::VRest) (consRecFieldTys F ETy RestTys)
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 7.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 H5 : valueType V ETy H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ valFieldTys ((F, V)::VRest) (consRecFieldTys F ETy RestTys)
< apply IH_T_RF to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 7.2: Variables: FT ET FE EE EE' O EE3 O2 O3 VRest V F Rest E RestTys ETy IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Ty : typeOf FT ET E ETy Ty1 : typeOfRecFields FT ET Rest RestTys H4 : related_all_scopes ET EE3 H5 : valueType V ETy H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : valFieldTys VRest RestTys ============================ valFieldTys ((F, V)::VRest) (consRecFieldTys F ETy RestTys)
< search. Proof completed.
< Extensible_Theorem paramTy_paramName_same : forall P NT T N, PT : paramTy P NT T -> PN : paramName P N -> NT = N on PT. Variables: NT T N IH : forall P NT T N, paramTy P NT T * -> paramName P N -> NT = N PT : paramTy (param NT T) NT T @ PN : paramName (param NT T) N ============================ NT = N
< case PN. Variables: T N IH : forall P NT T N, paramTy P NT T * -> paramName P N -> NT = N PT : paramTy (param N T) N T @ ============================ N = N
< search. Proof completed.
< Theorem paramTys_values_names_zip_same : forall Ps PTys Tys Ns, paramTys Ps PTys -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys. ============================ forall Ps PTys Tys Ns, paramTys Ps PTys -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys
< induction on 1. IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys ============================ forall Ps PTys Tys Ns, paramTys Ps PTys @ -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys
< intros PT V PN. Variables: Ps PTys Tys Ns IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys PT : paramTys Ps PTys @ V : values PTys Tys PN : paramNames Ps Ns ============================ zip Ns Tys PTys
< PT: case PT. Subgoal 1: Variables: Tys Ns IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys V : values [] Tys PN : paramNames [] Ns ============================ zip Ns Tys []
< case V. Subgoal 1: Variables: Ns IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys PN : paramNames [] Ns ============================ zip Ns [] []
< case PN. Subgoal 1: IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys ============================ zip [] [] []
< search. Subgoal 2: Variables: Tys Ns RestTys PTy PName Rest P IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys V : values ((PName, PTy)::RestTys) Tys PN : paramNames (P::Rest) Ns PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * ============================ zip Ns Tys ((PName, PTy)::RestTys)
< V: case V. Subgoal 2: Variables: Ns RestTys PTy PName Rest P VRest IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys PN : paramNames (P::Rest) Ns PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * V : values RestTys VRest ============================ zip Ns (PTy::VRest) ((PName, PTy)::RestTys)
< PN: case PN. Subgoal 2: Variables: RestTys PTy PName Rest P VRest NRest N IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * V : values RestTys VRest PN : paramName P N PN1 : paramNames Rest NRest ============================ zip (N::NRest) (PTy::VRest) ((PName, PTy)::RestTys)
< apply IH to PT1 V PN1. Subgoal 2: Variables: RestTys PTy PName Rest P VRest NRest N IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys PT : paramTy P PName PTy PT1 : paramTys Rest RestTys * V : values RestTys VRest PN : paramName P N PN1 : paramNames Rest NRest H1 : zip NRest VRest RestTys ============================ zip (N::NRest) (PTy::VRest) ((PName, PTy)::RestTys)
< apply paramTy_paramName_same to PT PN. Subgoal 2: Variables: RestTys PTy Rest P VRest NRest N IH : forall Ps PTys Tys Ns, paramTys Ps PTys * -> values PTys Tys -> paramNames Ps Ns -> zip Ns Tys PTys PT : paramTy P N PTy PT1 : paramTys Rest RestTys * V : values RestTys VRest PN : paramName P N PN1 : paramNames Rest NRest H1 : zip NRest VRest RestTys ============================ zip (N::NRest) (PTy::VRest) ((N, PTy)::RestTys)
< search. Proof completed.
< Extensible_Theorem funOK_getFunEvalInfo_related : forall F FT Name RetVar RVVal PNames Body, IsF : is_fun F -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> FOK : funOK FT F -> GFEI : getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) on FOK. Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Body1 Params RVVal1 RetVar1 RetTy FunName IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (fun FunName RetTy RetVar1 RVVal1 Params Body1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (fun FunName RetTy RetVar1 RVVal1 Params Body1) @ GFEI : getFunEvalInfo (fun FunName RetTy RetVar1 RVVal1 Params Body1) Name RetVar RVVal PNames Body FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar1, RetTy)::ParamTys] Body1 FinalTC FOK3 : lookup FT FunName (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar1 FOK6 : valueType RVVal1 RetTy ============================ exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys)
< GFEI: case GFEI. Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Params RetTy IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (fun Name RetTy RetVar RVVal Params Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (fun Name RetTy RetVar RVVal Params Body) @ FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC FOK3 : lookup FT Name (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar FOK6 : valueType RVVal RetTy GFEI : paramNames Params PNames ============================ exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys)
< Z: apply paramTys_values_names_zip_same to FOK1 FOK4 GFEI. Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Params RetTy IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (fun Name RetTy RetVar RVVal Params Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (fun Name RetTy RetVar RVVal Params Body) @ FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC FOK3 : lookup FT Name (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar FOK6 : valueType RVVal RetTy GFEI : paramNames Params PNames Z : zip PNames PTys ParamTys ============================ exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys)
< exists RetTy, PTys, ParamTys, FinalTC. Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Params RetTy IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (fun Name RetTy RetVar RVVal Params Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (fun Name RetTy RetVar RVVal Params Body) @ FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC FOK3 : lookup FT Name (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar FOK6 : valueType RVVal RetTy GFEI : paramNames Params PNames Z : zip PNames PTys ParamTys ============================ (((lookup FT Name (RetTy, PTys) /\ zip PNames PTys ParamTys) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC) /\ lookup FT Name (RetTy, PTys)
< search. Proof completed.
< Theorem funsOK_getFunEvalCtx_related : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'. ============================ forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< induction on 3. IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' ============================ forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs @ -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< intros IsFs IsFT FOK GFEC LT LE. Variables: Fs FT FE F RetTy ArgTys ArgNames Body RetVar RVVal IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFs : is_list is_fun Fs IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funsOK FT Fs @ GFEC : getFunEvalCtx Fs FE LT : lookup FT F (RetTy, ArgTys) LE : lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< FOK: case FOK. Subgoal 1: Variables: FT FE F RetTy ArgTys ArgNames Body RetVar RVVal IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFs : is_list is_fun [] IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT GFEC : getFunEvalCtx [] FE LT : lookup FT F (RetTy, ArgTys) LE : lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< case GFEC. Subgoal 1: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFs : is_list is_fun [] IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) LE : lookup [] F (RetVar, (RVVal, (ArgNames, Body))) ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< case LE. Subgoal 2: Variables: FT FE F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFs : is_list is_fun (F1::Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT GFEC : getFunEvalCtx (F1::Rest) FE LT : lookup FT F (RetTy, ArgTys) LE : lookup FE F (RetVar, (RVVal, (ArgNames, Body))) FOK : funOK FT F1 FOK1 : funsOK FT Rest * ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< GFE: case GFEC. Subgoal 2: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest Body1 PNames RVVal1 RetVar1 FName IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFs : is_list is_fun (F1::Rest) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) LE : lookup ((FName, (RetVar1, (RVVal1, (PNames, Body1))))::CRest) F (RetVar, (RVVal, (ArgNames, Body))) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 FName RetVar1 RVVal1 PNames Body1 GFE1 : getFunEvalCtx Rest CRest ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< case IsFs. Subgoal 2: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest Body1 PNames RVVal1 RetVar1 FName IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) LE : lookup ((FName, (RetVar1, (RVVal1, (PNames, Body1))))::CRest) F (RetVar, (RVVal, (ArgNames, Body))) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 FName RetVar1 RVVal1 PNames Body1 GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< Y: apply funOK_getFunEvalInfo_related to _ _ FOK GFE. Subgoal 2: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest Body1 PNames RVVal1 RetVar1 FName RetTy1 ArgTys1 Scope TyEnv' IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) LE : lookup ((FName, (RetVar1, (RVVal1, (PNames, Body1))))::CRest) F (RetVar, (RVVal, (ArgNames, Body))) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 FName RetVar1 RVVal1 PNames Body1 GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest Y : lookup FT FName (RetTy1, ArgTys1) Y1 : zip PNames ArgTys1 Scope Y2 : valueType RVVal1 RetTy1 Y3 : stmtOK FT [(RetVar1, RetTy1)::Scope] Body1 TyEnv' Y4 : lookup FT FName (RetTy1, ArgTys1) ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< L: case LE. Subgoal 2.1: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest RetTy1 ArgTys1 Scope TyEnv' IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 F RetVar RVVal ArgNames Body GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest Y : lookup FT F (RetTy1, ArgTys1) Y1 : zip ArgNames ArgTys1 Scope Y2 : valueType RVVal RetTy1 Y3 : stmtOK FT [(RetVar, RetTy1)::Scope] Body TyEnv' Y4 : lookup FT F (RetTy1, ArgTys1) ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< exists Scope, TyEnv'. Subgoal 2.1: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest RetTy1 ArgTys1 Scope TyEnv' IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 F RetVar RVVal ArgNames Body GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest Y : lookup FT F (RetTy1, ArgTys1) Y1 : zip ArgNames ArgTys1 Scope Y2 : valueType RVVal RetTy1 Y3 : stmtOK FT [(RetVar, RetTy1)::Scope] Body TyEnv' Y4 : lookup FT F (RetTy1, ArgTys1) ============================ (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< apply lookup_unique to LT Y4. Subgoal 2.1: Variables: FT F ArgNames Body RetVar RVVal Rest F1 CRest RetTy1 ArgTys1 Scope TyEnv' IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy1, ArgTys1) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 F RetVar RVVal ArgNames Body GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest Y : lookup FT F (RetTy1, ArgTys1) Y1 : zip ArgNames ArgTys1 Scope Y2 : valueType RVVal RetTy1 Y3 : stmtOK FT [(RetVar, RetTy1)::Scope] Body TyEnv' Y4 : lookup FT F (RetTy1, ArgTys1) ============================ (zip ArgNames ArgTys1 Scope /\ valueType RVVal RetTy1) /\ stmtOK FT [(RetVar, RetTy1)::Scope] Body TyEnv'
< search. Subgoal 2.2: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest Body1 PNames RVVal1 RetVar1 FName RetTy1 ArgTys1 Scope TyEnv' IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 FName RetVar1 RVVal1 PNames Body1 GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest Y : lookup FT FName (RetTy1, ArgTys1) Y1 : zip PNames ArgTys1 Scope Y2 : valueType RVVal1 RetTy1 Y3 : stmtOK FT [(RetVar1, RetTy1)::Scope] Body1 TyEnv' Y4 : lookup FT FName (RetTy1, ArgTys1) L : FName = F -> false L1 : lookup CRest F (RetVar, (RVVal, (ArgNames, Body))) ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< X: apply IH to _ _ FOK1 GFE1. Subgoal 2.2: Variables: FT F RetTy ArgTys ArgNames Body RetVar RVVal Rest F1 CRest Body1 PNames RVVal1 RetVar1 FName RetTy1 ArgTys1 Scope TyEnv' IH : forall Fs FT FE, is_list is_fun Fs -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funsOK FT Fs * -> getFunEvalCtx Fs FE -> forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT LT : lookup FT F (RetTy, ArgTys) FOK : funOK FT F1 FOK1 : funsOK FT Rest * GFE : getFunEvalInfo F1 FName RetVar1 RVVal1 PNames Body1 GFE1 : getFunEvalCtx Rest CRest H1 : is_fun F1 H2 : is_list is_fun Rest Y : lookup FT FName (RetTy1, ArgTys1) Y1 : zip PNames ArgTys1 Scope Y2 : valueType RVVal1 RetTy1 Y3 : stmtOK FT [(RetVar1, RetTy1)::Scope] Body1 TyEnv' Y4 : lookup FT FName (RetTy1, ArgTys1) L : FName = F -> false L1 : lookup CRest F (RetVar, (RVVal, (ArgNames, Body))) X : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup CRest F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' ============================ exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
< backchain X. Proof completed.
< Define output_forms : (list value) -> prop by output_forms []; output_forms ((intVal I)::Rest) := output_forms Rest; output_forms (trueVal::Rest) := output_forms Rest; output_forms (falseVal::Rest) := output_forms Rest; output_forms ((stringVal S)::Rest) := output_forms Rest.
< Theorem output_forms_append : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O -> output_forms O. ============================ forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O -> output_forms O
< induction on 3. IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O ============================ forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O @ -> output_forms O
< intros OA OB A. Variables: OA OB O IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OA : output_forms OA OB : output_forms OB A : OA ++ OB = O @ ============================ output_forms O
< A: case A. Subgoal 1: Variables: O IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OA : output_forms [] OB : output_forms O ============================ output_forms O
< search. Subgoal 2: Variables: OB L3 H T IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OA : output_forms (H::T) OB : output_forms OB A : T ++ OB = L3 * ============================ output_forms (H::L3)
< OA: case OA. Subgoal 2.1: Variables: OB L3 T I IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T ============================ output_forms ((intVal I)::L3)
< apply IH to _ _ A. Subgoal 2.1: Variables: OB L3 T I IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T H1 : output_forms L3 ============================ output_forms ((intVal I)::L3)
< search. Subgoal 2.2: Variables: OB L3 T IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T ============================ output_forms (trueVal::L3)
< apply IH to _ _ A. Subgoal 2.2: Variables: OB L3 T IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T H1 : output_forms L3 ============================ output_forms (trueVal::L3)
< search. Subgoal 2.3: Variables: OB L3 T IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T ============================ output_forms (falseVal::L3)
< apply IH to _ _ A. Subgoal 2.3: Variables: OB L3 T IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T H1 : output_forms L3 ============================ output_forms (falseVal::L3)
< search. Subgoal 2.4: Variables: OB L3 T S IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T ============================ output_forms ((stringVal S)::L3)
< apply IH to _ _ A. Subgoal 2.4: Variables: OB L3 T S IH : forall OA OB O, output_forms OA -> output_forms OB -> OA ++ OB = O * -> output_forms O OB : output_forms OB A : T ++ OB = L3 * OA : output_forms T H1 : output_forms L3 ============================ output_forms ((stringVal S)::L3)
< search. Proof completed.
< Extensible_Theorem evalExpr_output_forms : forall E FE EE V EE' O, IsE : is_expr E -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalExpr FE EE E V EE' O -> output_forms O on Ev as IH_E, evalStmt_output_forms : forall S FE EE EE' O, IsS : is_stmt S -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalStmt FE EE S EE' O -> output_forms O on Ev as IH_S, evalArgs_output_forms : forall A FE EE Vs EE' O, IsA : is_args A -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalArgs FE EE A Vs EE' O -> output_forms O on Ev as IH_A, evalRecFields_output_forms : forall RF FE EE Fields EE' O, IsRF : is_recFieldExprs RF -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ev : evalRecFields FE EE RF Fields EE' O -> output_forms O on Ev as IH_RF. Subgoal 1.1: Variables: FE EE' I IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (num I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ output_forms []
< search. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (plus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.2: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (minus E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.3: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (mult E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.4: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (div E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.5: Variables: FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.6: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr true IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ output_forms []
< search. Subgoal 1.7: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ output_forms []
< search. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.8: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ output_forms O
< case IsE. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.9: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O ============================ output_forms O
< search. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (and E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.10: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ output_forms O
< case IsE. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.11: Variables: FE EE EE' O E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O ============================ output_forms O
< search. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.12: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (or E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.13: Variables: FE EE EE' O EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ output_forms O
< case IsE. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.14: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (not E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ output_forms O
< case IsE. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.15: Variables: FE EE EE' O E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.16: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (greater E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.17: Variables: FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.18: Variables: FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (eq E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.19: Variables: FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.20: Variables: FE EE' S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (stringLit S) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ output_forms []
< search. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (appString E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.21: Variables: FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.22: Variables: FE V EE' X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (name X) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V ============================ output_forms []
< search. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (call Fun Args) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ output_forms O
< case IsE. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ output_forms O
< IsF: apply lookup_is_value_funCtx to _ Ev1. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ output_forms O
< IsF: case IsF. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ output_forms O
< IsF: case IsF1. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ output_forms O
< IsF: case IsF2. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ output_forms O
< apply IH_A to _ _ _ Ev2. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : output_forms O2 ============================ output_forms O
< apply evalArgs_isValue to _ _ _ Ev2. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : output_forms O2 H4 : is_list is_value ArgVals ============================ output_forms O
< apply zip_is to _ _ Ev3. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : output_forms O2 H4 : is_list is_value ArgVals H5 : is_list (is_pair is_string is_value) InitEnv ============================ output_forms O
< apply IH_S to _ _ _ Ev4. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : output_forms O2 H4 : is_list is_value ArgVals H5 : is_list (is_pair is_string is_value) InitEnv H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev5. Subgoal 1.23: Variables: FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H3 : output_forms O2 H4 : is_list is_value ArgVals H5 : is_list (is_pair is_string is_value) InitEnv H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (stmtExpr S E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ output_forms O
< apply IH_S to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : output_forms O2 ============================ output_forms O
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.24: Variables: FE EE V EE' O EE3 O2 Scope O3 E1 S IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (recBuild RF) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * ============================ output_forms O
< case IsE. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ output_forms O
< apply IH_RF to _ _ _ Ev1. Subgoal 1.25: Variables: FE EE EE' O VF RF IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF H2 : output_forms O ============================ output_forms O
< search. Subgoal 1.26: Variables: FE EE V EE' O Fields F Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (recFieldAccess Rec F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ output_forms O
< case IsE. Subgoal 1.26: Variables: FE EE V EE' O Fields F Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.26: Variables: FE EE V EE' O Fields F Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F H3 : output_forms O ============================ output_forms O
< search. Subgoal 2.1: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt noop IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalStmt FE EE' noop EE' [] @ ============================ output_forms []
< search. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (seq S1 S2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsS. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ output_forms O
< apply IH_S to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : output_forms O2 ============================ output_forms O
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_S to _ _ _ Ev2. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 2.2: Variables: FE EE EE' O EE3 O2 O3 S2 S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (seq S1 S2) EE' O @ Ev1 : evalStmt FE EE S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 2.3: Variables: FE EE O EE2 Scope V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (declare Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ output_forms O
< case IsS. Subgoal 2.3: Variables: FE EE O EE2 Scope V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.3: Variables: FE EE O EE2 Scope V X E Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : output_forms O ============================ output_forms O
< search. Subgoal 2.4: Variables: FE EE EE' O V EE3 E X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (assign X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ output_forms O
< case IsS. Subgoal 2.4: Variables: FE EE EE' O V EE3 E X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.4: Variables: FE EE EE' O V EE3 E X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assign X E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E H3 : output_forms O ============================ output_forms O
< search. Subgoal 2.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (recUpdate Rec Fields E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ output_forms O
< case IsS. Subgoal 2.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.5: Variables: FE EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE EE E V EE3 O * Ev2 : lookupScopes Rec EE (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E H4 : output_forms O ============================ output_forms O
< search. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsS. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_S to _ _ _ Ev2. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 2.6: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (ifThenElse Cond Th El) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsS. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_S to _ _ _ Ev2. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 2.7: Variables: FE EE EE' O EE3 O2 Scope O3 El Th Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ output_forms O
< case IsS. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ output_forms O
< apply IH_S to _ _ _ Ev2. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : output_forms O3 ============================ output_forms O
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : output_forms O3 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ output_forms O
< case IsEE4+. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : output_forms O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ output_forms O
< apply IH_S to _ _ _ Ev3. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : output_forms O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : output_forms O4 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : output_forms O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : output_forms O4 H9 : output_forms O12 ============================ output_forms O
< apply output_forms_append to _ _ Ev5. Subgoal 2.8: Variables: FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : output_forms O3 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : output_forms O4 H9 : output_forms O12 H10 : output_forms O ============================ output_forms O
< search. Subgoal 2.9: Variables: FE EE EE' O Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (while Cond Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * ============================ output_forms O
< case IsS. Subgoal 2.9: Variables: FE EE EE' O Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.9: Variables: FE EE EE' O Body Cond IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while Cond Body) EE' O @ Ev1 : evalExpr FE EE Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body H3 : output_forms O ============================ output_forms O
< search. Subgoal 2.10: Variables: FE EE EE' O Scope S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (scopeStmt S1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * ============================ output_forms O
< case IsS. Subgoal 2.10: Variables: FE EE EE' O Scope S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 ============================ output_forms O
< apply IH_S to _ _ _ Ev1. Subgoal 2.10: Variables: FE EE EE' O Scope S1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::EE) S1 (Scope::EE') O * H1 : is_stmt S1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ output_forms O
< case IsS. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : output_forms O2 ============================ output_forms O
< apply output_forms_append to _ _ Ev2. Subgoal 2.11: Variables: FE EE EE' O I O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E H2 : output_forms O2 H3 : output_forms O ============================ output_forms O
< search. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ output_forms O
< case IsS. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : output_forms O2 ============================ output_forms O
< apply output_forms_append to _ _ Ev2. Subgoal 2.12: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E H2 : output_forms O2 H3 : output_forms O ============================ output_forms O
< search. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ output_forms O
< case IsS. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : output_forms O2 ============================ output_forms O
< apply output_forms_append to _ _ Ev2. Subgoal 2.13: Variables: FE EE EE' O O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E H2 : output_forms O2 H3 : output_forms O ============================ output_forms O
< search. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (printVal E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ output_forms O
< case IsS. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : output_forms O2 ============================ output_forms O
< apply output_forms_append to _ _ Ev2. Subgoal 2.14: Variables: FE EE EE' O S1 O2 E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (printVal E) EE' O @ Ev1 : evalExpr FE EE E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E H2 : output_forms O2 H3 : output_forms O ============================ output_forms O
< search. Subgoal 3.1: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsA : is_args nilArgs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ output_forms []
< search. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsA : is_args (consArgs E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsA. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_A to _ _ _ Ev2. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 3.2: Variables: FE EE EE' O EE3 O2 O3 VRest V Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalArgs FE EE (consArgs E Rest) (V::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 4.1: Variables: FE EE' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsRF : is_recFieldExprs nilRecFieldExprs IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ output_forms []
< search. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsRF. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_RF to _ _ _ Ev2. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 4.2: Variables: FE EE EE' O EE3 O2 O3 VRest V F Rest E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V)::VRest) EE' O @ Ev1 : evalExpr FE EE E V EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Proof completed.
< Extensible_Theorem evalProgram_output_forms : forall A P O, IsA : is_list is_value A -> IsP : is_program P -> Ev : evalProgram A P O -> output_forms O on Ev. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_list is_value A -> is_program P -> evalProgram A P O * -> output_forms O IsA : is_list is_value A IsP : is_program (program Funs Main) Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O ============================ output_forms O
< case IsP. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_list is_value A -> is_program P -> evalProgram A P O * -> output_forms O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O H1 : is_list is_fun Funs H2 : is_fun Main ============================ output_forms O
< apply getFunEvalCtx_is to _ Ev1. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_list is_value A -> is_program P -> evalProgram A P O * -> output_forms O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx ============================ output_forms O
< apply getFunEvalInfo_is to _ Ev2. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_list is_value A -> is_program P -> evalProgram A P O * -> output_forms O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx H4 : is_string MainName H5 : is_string RetVar H6 : is_value RetVal H7 : is_list is_string PNames H8 : is_stmt Body ============================ output_forms O
< apply zip_is to _ _ Ev3. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_list is_value A -> is_program P -> evalProgram A P O * -> output_forms O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx H4 : is_string MainName H5 : is_string RetVar H6 : is_value RetVal H7 : is_list is_string PNames H8 : is_stmt Body H9 : is_list (is_pair is_string is_value) InitEnv ============================ output_forms O
< apply evalStmt_output_forms to _ _ _ Ev4. Variables: A O FCtx MainName RetVar RetVal PNames Body InitEnv EE Main Funs IH : forall A P O, is_list is_value A -> is_program P -> evalProgram A P O * -> output_forms O IsA : is_list is_value A Ev : evalProgram A (program Funs Main) O @ Ev1 : getFunEvalCtx Funs FCtx Ev2 : getFunEvalInfo Main MainName RetVar RetVal PNames Body Ev3 : zip PNames A InitEnv Ev4 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx H4 : is_string MainName H5 : is_string RetVar H6 : is_value RetVal H7 : is_list is_string PNames H8 : is_stmt Body H9 : is_list (is_pair is_string is_value) InitEnv H10 : output_forms O ============================ output_forms O
< search. Proof completed.
< Extensible_Theorem paramName_exists : forall P, IsP : is_param P -> exists N, paramName P N on IsP. Variables: Typ S IH : forall P, is_param P * -> exists N, paramName P N IsP : is_param (param S Typ) @ IsP1 : is_string S IsP2 : is_typ Typ ============================ exists N, paramName (param S Typ) N
< search. Proof completed.
< Theorem paramNames_exists : forall Ps, is_list is_param Ps -> exists Ns, paramNames Ps Ns. ============================ forall Ps, is_list is_param Ps -> exists Ns, paramNames Ps Ns
< induction on 1. IH : forall Ps, is_list is_param Ps * -> exists Ns, paramNames Ps Ns ============================ forall Ps, is_list is_param Ps @ -> exists Ns, paramNames Ps Ns
< intros IsPs. Variables: Ps IH : forall Ps, is_list is_param Ps * -> exists Ns, paramNames Ps Ns IsPs : is_list is_param Ps @ ============================ exists Ns, paramNames Ps Ns
< Is: case IsPs. Subgoal 1: IH : forall Ps, is_list is_param Ps * -> exists Ns, paramNames Ps Ns ============================ exists Ns, paramNames [] Ns
< search. Subgoal 2: Variables: T H IH : forall Ps, is_list is_param Ps * -> exists Ns, paramNames Ps Ns Is : is_param H Is1 : is_list is_param T * ============================ exists Ns, paramNames (H::T) Ns
< apply paramName_exists to Is. Subgoal 2: Variables: T H N IH : forall Ps, is_list is_param Ps * -> exists Ns, paramNames Ps Ns Is : is_param H Is1 : is_list is_param T * H1 : paramName H N ============================ exists Ns, paramNames (H::T) Ns
< apply IH to Is1. Subgoal 2: Variables: T H N Ns IH : forall Ps, is_list is_param Ps * -> exists Ns, paramNames Ps Ns Is : is_param H Is1 : is_list is_param T * H1 : paramName H N H2 : paramNames T Ns ============================ exists Ns, paramNames (H::T) Ns
< search. Proof completed.
< Extensible_Theorem getFunEvalInfo_exists : forall F, IsF : is_fun F -> exists N R V P B, getFunEvalInfo F N R V P B on IsF. Variables: Stmt L Value S Typ S1 IH : forall F, is_fun F * -> exists N R V P B, getFunEvalInfo F N R V P B IsF : is_fun (fun S1 Typ S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_string S IsF4 : is_value Value IsF5 : is_list is_param L IsF6 : is_stmt Stmt ============================ exists N R V P B, getFunEvalInfo (fun S1 Typ S Value L Stmt) N R V P B
< apply paramNames_exists to IsF5. Variables: Stmt L Value S Typ S1 Ns IH : forall F, is_fun F * -> exists N R V P B, getFunEvalInfo F N R V P B IsF : is_fun (fun S1 Typ S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_string S IsF4 : is_value Value IsF5 : is_list is_param L IsF6 : is_stmt Stmt H1 : paramNames L Ns ============================ exists N R V P B, getFunEvalInfo (fun S1 Typ S Value L Stmt) N R V P B
< search. Proof completed.
< Theorem getFunEvalCtx_exists : forall Fs, is_list is_fun Fs -> exists Ctx, getFunEvalCtx Fs Ctx. ============================ forall Fs, is_list is_fun Fs -> exists Ctx, getFunEvalCtx Fs Ctx
< induction on 1. IH : forall Fs, is_list is_fun Fs * -> exists Ctx, getFunEvalCtx Fs Ctx ============================ forall Fs, is_list is_fun Fs @ -> exists Ctx, getFunEvalCtx Fs Ctx
< intros Is. Variables: Fs IH : forall Fs, is_list is_fun Fs * -> exists Ctx, getFunEvalCtx Fs Ctx Is : is_list is_fun Fs @ ============================ exists Ctx, getFunEvalCtx Fs Ctx
< Is: case Is. Subgoal 1: IH : forall Fs, is_list is_fun Fs * -> exists Ctx, getFunEvalCtx Fs Ctx ============================ exists Ctx, getFunEvalCtx [] Ctx
< search. Subgoal 2: Variables: T H IH : forall Fs, is_list is_fun Fs * -> exists Ctx, getFunEvalCtx Fs Ctx Is : is_fun H Is1 : is_list is_fun T * ============================ exists Ctx, getFunEvalCtx (H::T) Ctx
< apply getFunEvalInfo_exists to Is. Subgoal 2: Variables: T H N R V P B IH : forall Fs, is_list is_fun Fs * -> exists Ctx, getFunEvalCtx Fs Ctx Is : is_fun H Is1 : is_list is_fun T * H1 : getFunEvalInfo H N R V P B ============================ exists Ctx, getFunEvalCtx (H::T) Ctx
< apply IH to Is1. Subgoal 2: Variables: T H N R V P B Ctx IH : forall Fs, is_list is_fun Fs * -> exists Ctx, getFunEvalCtx Fs Ctx Is : is_fun H Is1 : is_list is_fun T * H1 : getFunEvalInfo H N R V P B H2 : getFunEvalCtx T Ctx ============================ exists Ctx, getFunEvalCtx (H::T) Ctx
< search. Proof completed.